เปิดตัว jj v0.43.0
(github.com/jj-vcs)- jj v0.43.0 ระบบควบคุมเวอร์ชันที่เข้ากันได้กับ Git เพิ่ม
jj runสำหรับรันคำสั่งกับหลาย change set ทำให้งานตรวจสอบและแก้ไขซ้ำ ๆ เป็นอัตโนมัติได้มากขึ้น jj runใช้ working copy เฉพาะ สำหรับแต่ละ change set และยังส่งต่อการเปลี่ยนแปลงกับ conflict จากคำสั่งที่แก้ไข working copy เช่นcargo checkหรือcargo fix- รีลีสนี้มีการเปลี่ยนแปลงที่กระทบกับ วิธีใช้ค่าตั้งเดิมและ revset เช่น
git_head(),git_refs(), การตีความสัญลักษณ์แบบ Git และการถอดui.revsets-use-glob-by-default - มีการเพิ่ม
jj show --reversed, การค้นหาค่าตั้งใน/etc/jj,jj config gc,jj gerrit upload -o, ฟังก์ชัน revsetforks()และ สไตล์สีข้อความขีดฆ่า - แก้ไขปัญหาเกี่ยวกับการจัดการ file identity บน Windows, snapshot ของ working copy ที่เป็น immutable, คำเตือน URL ของ remote ที่ซ้ำกัน และปัญหา loose Git object เสียหาย บน Intel Raptor Lake และ aarch64
ภาพรวมรีลีส
- jj คือระบบควบคุมเวอร์ชันที่เรียบง่ายแต่ทรงพลัง และเข้ากันได้กับ Git
- ใน v0.43.0 มีการเพิ่ม
jj runสำหรับใช้คำสั่งกับหลาย change set - ดูคำแนะนำการติดตั้งเพื่อเริ่มต้นได้ที่ installation instructions
รันคำสั่งแยกตาม change set: jj run
jj runสามารถรันคำสั่งเดียวกันกับหลาย change set ได้- แต่ละ change set ใช้ working copy เฉพาะ ที่แยกจากกัน
- คำสั่งที่รันสามารถอัปเดต working copy ได้ และการเปลี่ยนแปลงกับ conflict ที่เกิดขึ้นจะถูกส่งต่ออย่างเหมาะสม
- ตัวอย่างการใช้งานมีดังนี้
jj run -- cargo check --all-featuresjj run -- cargo fix
สิ่งที่ถูกถอดออกและมีผลต่อความเข้ากันได้
- มีการถอดฟังก์ชัน
git_head()และgit_refs()ที่เลิกใช้งานแล้วออกจาก revset และ template - สัญลักษณ์แบบ Git เช่น
refs/heads/mainจะไม่ถูกตีความเป็น revision อีกต่อไป- ควรใช้ไวยากรณ์
<name>หรือ<name>@<remote>ของ bookmark/tag แทน
- ควรใช้ไวยากรณ์
- ตัวเลือก
ui.revsets-use-glob-by-defaultที่เลิกใช้งานแล้วก็ถูกนำออกเช่นกัน jj bookmark trackและuntrackจะไม่รองรับแพตเทิร์น<kind>:<bookmark>@<remote>อีกต่อไป- ไวยากรณ์สัญลักษณ์
<bookmark>@<remote>ยังรองรับต่อไป - อ้างอิงปัญหาที่เกี่ยวข้อง: #9226
- ไวยากรณ์สัญลักษณ์
ฟีเจอร์ใหม่
jj showรองรับแฟล็ก--reversedjjจะค้นหาไฟล์ค่าตั้งจาก/etc/jjด้วยjj config gcจะล้างค่าตั้งของ repository ที่ถูกลบหรือย้ายออกจากโฟลเดอร์~/.config/jj/repos- อ้างอิงปัญหาที่เกี่ยวข้อง: #9362
jj gerrit uploadรองรับแฟล็ก-o/--optionที่ทำงานคล้ายgit push -oหรือ--push-optionjj git fetchจะ rebase revision ลูกของ revision ที่ถูกเขียนใหม่โดยอิงจาก change ID- ก่อนหน้านี้ เมื่อมีหลาย revision ในสแตกที่มี bookmark ติดอยู่ revision ที่ถูกเขียนใหม่และ revision ลูกของมันจะไม่ได้ถูก rebase เสมอไป
- revision ลูกที่เป็น immutable จะไม่ถูก rebase
- เพิ่มฟังก์ชัน revset
forks()- คืนค่าคอมมิตทั้งหมดที่มีลูกตั้งแต่ 2 ตัวขึ้นไป
- ค่าตั้ง
colorsรองรับ สไตล์ข้อความขีดฆ่า ด้วย{ crossed-out = true }
ปัญหาที่ได้รับการแก้ไข
- บน Windows จะไม่ตาม symbolic link อีกต่อไปเมื่อค้นหา file identity ของ path
- ทำให้พฤติกรรมสอดคล้องกับ Unix
- ก่อนหน้านี้ symbolic link สองตัวที่ชี้ไปยังปลายทางเดียวกันจะถูกมองว่าเป็นไฟล์เดียวกัน
- การตรวจสอบ identity นี้ใช้เพื่อตรวจจับ alias ของไดเรกทอรี
.gitและ.jjที่สงวนไว้เมื่อเขียน working copy - อ้างอิงปัญหาที่เกี่ยวข้อง: #8924
- เมื่อ working copy อยู่ในสถานะ immutable
jjจะสร้าง revision ของ working copy ใหม่ระหว่างการ snapshot jj git remote addจะเตือนเมื่อ fetch URL หรือ effective push URL ของ remote ใหม่ตรงกับ remote ที่มีอยู่เดิมทุกประการ- อ้างอิงปัญหาที่เกี่ยวข้อง: #413
- แก้ไขปัญหา loose Git object ที่เสียหาย บน CPU Intel Raptor Lake และ aarch64
- ก่อนหน้านี้
jjอาจรายงานว่าคอมมิตสำเร็จ แต่หลังจากนั้นgit fsckอาจล้มเหลวด้วยincorrect data check,corrupt loose object,missing blob - และงานของ
jjในภายหลังอาจล้มเหลวด้วยcorrupt deflate stream
- ก่อนหน้านี้
1 ความคิดเห็น
ความคิดเห็นบน Lobste.rs
ตั้งตารอ
jj runมากดีใจที่ ยกเลิกการเลิกสนับสนุน
jj bookmark track/untrack <name>@<remote>การต้องพิมพ์
--remoteทุกครั้งมันไม่ค่อยโอเคมาตลอดส่วนที่แก้ loose Git object ที่เสียหาย บน
Intel Raptor Lake CPUและaarch64ฟังดูเป็นบั๊กที่น่าสนใจถ้ามีบล็อกโพสต์ที่เกี่ยวข้องก็อยากอ่านดู 😃
ที่ผ่านมาผมคิดว่า Git object ที่เสียหายทั้งหมดที่เคยเห็นเป็นเพราะการ rollback ของไฟล์ซิสเต็ม
หลังปิดเครื่องแบบ hard shutdown แล้ว f2fs rollback มักทำให้สถานะดิสก์ออกมาค่อนข้างน่าสนใจ เลยรู้สึกน่าสนใจมากที่ได้รู้ว่าจริง ๆ แล้วมีส่วนที่พังอยู่ตรงนั้น
สงสัยว่า
jj runต่างจากjj fixอย่างไรในตัวอย่าง changelog ก็ใช้
jj runรันcargo fixด้วย ดูเหมือนสองอย่างนี้ทับซ้อนกันชัดเจนjj runจะสร้าง working copy ทั้งชุด แล้วรันคำสั่งในนั้นjj fixจะ pipe เนื้อหาของไฟล์เดียวเข้าไปยังคำสั่ง และใช้ผลลัพธ์ที่ออกมาเป็นเนื้อหาใหม่ของไฟล์นั้นถ้าเครื่องมือเข้ากับ
jj fixได้ดี เช่นพวก formatter หรือ linter โดยทั่วไปจะเร็วกว่าเยอะ แต่jj runยืดหยุ่นกว่าrunจะรันคำสั่งสำหรับแต่ละ change ส่วนfixจะรันตัวกรองกับแต่ละไฟล์ที่เปลี่ยนในกรณีของผมก็คือใช้
runรัน test suite เพื่อตรวจว่าแต่ละ commit ใช้ได้ จากนั้นใช้fixรัน formatter กับไฟล์ผมยังไม่ได้อัปเดต และนี่เป็นเพียงการตีความของผมเท่านั้น
คงจะลองเล่น
jj runดูนิดหน่อย แต่คิดว่ามีโอกาสสูงที่มันจะยุ่งยากเกินจำเป็นเพราะวิธีที่ผมใช้ direnv