1 คะแนน โดย GN⁺ 5 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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, ฟังก์ชัน revset forks() และ สไตล์สีข้อความขีดฆ่า
  • แก้ไขปัญหาเกี่ยวกับการจัดการ 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-features
    • jj 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 รองรับแฟล็ก --reversed
  • jj จะค้นหาไฟล์ค่าตั้งจาก /etc/jj ด้วย
  • jj config gc จะล้างค่าตั้งของ repository ที่ถูกลบหรือย้ายออกจากโฟลเดอร์ ~/.config/jj/repos
    • อ้างอิงปัญหาที่เกี่ยวข้อง: #9362
  • jj gerrit upload รองรับแฟล็ก -o / --option ที่ทำงานคล้าย git push -o หรือ --push-option
  • jj 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
    • ก่อนหน้านี้ revision ใหม่จะถูกสร้างทันทีหลังจาก working copy กลายเป็น immutable
    • อ้างอิงปัญหาที่เกี่ยวข้อง: #7751, #9338
  • 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 ความคิดเห็น

 
GN⁺ 5 시간 전
ความคิดเห็นบน 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