- jj เป็นระบบควบคุมเวอร์ชันที่เข้ากันได้กับ Git และแนะนำให้ใช้บรานช์แบบไม่ระบุนาม แต่เมื่อต้อง
push ไปยังรีโพซิทอรี Git ก็ยังต้องมี bookmark หรือก็คือชื่อบรานช์ของ Git
- ค่าเริ่มต้นของ
jj git push --change xyz จะสร้างบรานช์ push-xyz ซึ่งยึดตาม change ID ทำให้ใช้งานบน CLI ได้เป็นธรรมชาติ แต่ในรายการบน GitHub กลับนึกได้ยากว่าบรานช์นั้นเกี่ยวกับงานอะไร
- สามารถปรับเทมเพลต
git_push_bookmark ให้ใช้บรรทัดแรกของคำอธิบายมาทำเป็น slug สั้น ๆ ด้วย slugify() แล้วต่อท้ายด้วย change ID แบบสั้น เพื่อให้ดีขึ้นได้
jj git push --change ozkspkuyzpwu จะสร้าง add-note-about-jj-bookmark-templates/ozkspkuyzpwu ทำให้ทั้งอ่านง่ายและยังคง ความเชื่อมโยงกับรีวิชัน ไว้
- ในรีโพซิทอรีที่ใช้ร่วมกัน สามารถเติม namespace อย่าง
ddbeck/ ไว้ด้านหน้าได้ แต่กฎของชื่อบรานช์ Git มีความซับซ้อน ถ้าชื่อไม่ถูกต้องจะต้องสร้าง bookmark ด้วยตนเอง
ปรับปรุงชื่อบรานช์สำหรับ Git push ใน jj
jj (Jujutsu) เป็นระบบควบคุมเวอร์ชันที่เข้ากันได้กับ Git และคาดหวังพร้อมทั้งแนะนำให้ใช้ บรานช์แบบไม่ระบุนาม ด้วยหลายเหตุผล
- เมื่อต้อง
push ไปยังรีโพซิทอรี Git แม้แต่บรานช์แบบไม่ระบุนามก็ยังต้องมีชื่อ โดยใน jj เรียกสิ่งนี้ว่า bookmark ส่วนใน Git เรียกว่า branch
jj git push --change xyz จะ push รีวิชันที่มี ID เป็น xyz ไปยังบรานช์ Git ชื่อ push-xyz
- ค่าปริยายนี้ดูเป็นธรรมชาติในแง่ที่ว่า
jj CLI มักแสดงและใช้งาน change ID อยู่แล้ว แต่ในรายการบรานช์บนเว็บไซต์ GitHub การเห็นแค่ push-xyz ทำให้จำได้ยากว่ากำลังทำงานอะไรอยู่
วิธีเปลี่ยนการตั้งค่า
- สร้าง template alias
slugify() ขึ้นมาใหม่ และปรับให้เทมเพลต git_push_bookmark ใช้งานมัน
[template-aliases]
"slugify(str)" = '''
truncate_end(
65,
str.first_line()
.replace(regex:'[^[[:alnum:]].]', '-')
.replace(regex:'-{2,}', '-')
.replace(regex:'\.{2,}', '.')
.replace(regex:'(^-+|-+$)', '')
.lower()
)
'''
[templates]
git_push_bookmark = 'slugify(description) ++ "/" ++ change_id.short()'
slugify() จะใช้บรรทัดแรกของคำอธิบายการเปลี่ยนแปลงเพื่อสร้างชื่อแบบ slug ที่สั้น แล้วต่อท้ายด้วย change ID แบบสั้น
- ตัวอย่างเช่น เมื่อรัน
jj git push --change ozkspkuyzpwu จะได้ add-note-about-jj-bookmark-templates/ozkspkuyzpwu
- ชื่อนี้อ่านง่ายขึ้น และยังคงความเชื่อมโยงกับ revision ID ที่แสดงใน
jj CLI ไว้ได้
- ถ้าจะ
push ไปยังรีโพซิทอรีที่ใช้ร่วมกับผู้อื่น ก็สามารถแก้เทมเพลตให้บรานช์ของตัวเองอยู่ภายใต้ namespace แยกต่างหากได้
[templates]
git_push_bookmark = '"ddbeck/" ++ slugify(description) ++ "/" ++ change_id.short()'
- ไม่สามารถรับประกันได้ว่าชื่อบรานช์ Git จะปลอดภัยเสมอไป
- กฎของชื่อบรานช์ที่ Git ยอมรับนั้นซับซ้อน และถ้าเทมเพลตสร้างชื่อที่ไม่ถูกต้องก็จะเกิดข้อผิดพลาด ทำให้ต้องสร้าง bookmark ด้วยตนเอง
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ใช้วิธี ใส่และนำเมตาดาต้าไปใช้ ในข้อความคอมมิตได้ค่อนข้างดี
เริ่มจากสร้าง alias
trailer_v(key)สำหรับดึงค่า trailer จากคำอธิบายคอมมิตได้ง่าย ๆ แล้วในสคริปต์ push ของnushellก็ใช้jj logเพื่อประกอบ label ของบรานช์ในรูปแบบticket/topicตัวอย่างเช่น ถ้าใส่
ticket:TKT-123,topic:stop-crashingไว้ในข้อความคอมมิต สคริปต์ที่ push ไป GitHub และเปิดหน้า"Create PR"ก็จะดึงค่านั้นไปใช้Git trailers เหมาะเป็นที่เก็บคีย์-ค่าแบบใช้ได้สม่ำเสมอภายในคำอธิบาย แต่ตอนนี้ยังดึงออกมาใช้ในภาษา
revsetได้ค่อนข้างลำบากอยู่บ้างการทำให้ชื่อบรานช์เป็น slug โดยอิงจากข้อความคอมมิตหรือเนื้อหาการเปลี่ยนแปลง ดูเหมือนจะเป็นงานที่ LLM แบบรันโลคัลจัดการได้ง่าย
เคยมีหลายครั้งที่เพื่อนร่วมทีมถามเกี่ยวกับชื่อบรานช์ที่
jjสร้างให้อัตโนมัติคิดว่าจะลองใช้วิธีนี้แบบดัดแปลงกับบรานช์คอมมิตที่ใช้ครั้งเดียว
ถ้าเป็น ชื่อบรานช์ที่อิงกับ change-id ก็ถือว่าสมบูรณ์แบบแล้ว ไม่อยากเปลี่ยนเลย
นี่เป็นแค่ชื่อบรานช์ที่เครื่องมือ code review อันแย่มากบังคับให้ใช้ ไม่ใช่ชื่อเรื่อง
อาจแก้ได้ด้วยเครื่องมือสำหรับทำ PR อัตโนมัติ แต่แนวทางนี้เรียบง่ายดี