1 คะแนน โดย GN⁺ 1 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 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 แบบรันโลคัลจัดการได้ง่าย

    • รู้สึกว่าไม่ได้มีเหตุผลมากพอที่จะต้องใช้ LLM สคริปต์ง่าย ๆ ในบทความน่าจะเบากว่า เร็วกว่า และน่าจะทำงานได้ดีแทบไม่ต่างกัน
  • เคยมีหลายครั้งที่เพื่อนร่วมทีมถามเกี่ยวกับชื่อบรานช์ที่ jj สร้างให้อัตโนมัติ
    คิดว่าจะลองใช้วิธีนี้แบบดัดแปลงกับบรานช์คอมมิตที่ใช้ครั้งเดียว

  • ถ้าเป็น ชื่อบรานช์ที่อิงกับ change-id ก็ถือว่าสมบูรณ์แบบแล้ว ไม่อยากเปลี่ยนเลย
    นี่เป็นแค่ชื่อบรานช์ที่เครื่องมือ code review อันแย่มากบังคับให้ใช้ ไม่ใช่ชื่อเรื่อง

    • โดยรวมก็พอใจกับชื่อบรานช์อัตโนมัติเริ่มต้นอยู่แล้ว แต่พอ push ชุดการเปลี่ยนแปลงเพื่อทำเป็น PR อาจสับสนได้ว่าแต่ละ PR ควรชี้ไปที่บรานช์ไหน
      อาจแก้ได้ด้วยเครื่องมือสำหรับทำ PR อัตโนมัติ แต่แนวทางนี้เรียบง่ายดี
    • ที่ $JOB มีธรรมเนียมให้ใช้ ชื่อบรานช์ที่สื่อความหมาย