การพัฒนา Git Interactive Add ด้วย Go จุดประกายการอภิปรายเรื่องการรวมเข้า Upstream

BigGo Editorial Team
การพัฒนา Git Interactive Add ด้วย Go จุดประกายการอภิปรายเรื่องการรวมเข้า Upstream

การพัฒนาฟังก์ชัน interactive add ของ Git ด้วยภาษา Go ได้ดึงดูดความสนใจจากนักพัฒนา ไม่เพียงแค่เพราะฟีเจอร์ที่ปรับปรุงใหม่ แต่ยังเป็นเพราะการอภิปรายในชุมชนที่เกิดขึ้นเกี่ยวกับความเป็นไปได้ในการแทนที่การพัฒนาด้วย Perl แบบเดิมใน upstream

การพอร์ตด้วย Go นี้ได้สร้างคำสั่ง git add -i และ git add -p ที่คุ้นเคยขึ้นมาใหม่ พร้อมเพิ่มฟีเจอร์ปรับปรุงที่ทรงพลังหลายอย่าง ซึ่งรวมถึงการกรองแบบ global ข้ามไฟล์ทั้งหมดโดยใช้ regex patterns การแบ่ง hunk อัตโนมัติ และการดำเนินการแบบ bulk ที่สามารถยอมรับ hunk ที่ตรงกันทั้งหมดในครั้งเดียว เครื่องมือนี้ยังคงความเข้ากันได้อย่างสมบูรณ์กับการกำหนดค่าสีที่มีอยู่ของ Git และรองรับ patch modes หลักทั้งหมด

คำสั่งที่ปรับปรุงจากเวอร์ชัน Perl เดิม:

  • G <regex> - การกรองแบบ Global ทั่วทุกไฟล์โดยใช้รูปแบบ regex
  • G - ล้างตัวกรองพร้อมแจ้งเตือนแบบโต้ตอบสำหรับรูปแบบใหม่
  • S - การแยกอัตโนมัติเพื่อเปิดใช้งานความละเอียดสูงสุดทั่วโลก
  • A - ยอมรับ hunk ทั้งหมดทั่วทุกไฟล์หลังจากการกรองและแยก

ความสนใจของชุมชนในการรวมเข้า Upstream

สิ่งที่น่าสนใจเป็นพิเศษคือการที่ชุมชนให้ความสำคัญทันทีกับการนำการพัฒนานี้เข้าสู่ codebase หลักของ Git นักพัฒนาคนหนึ่งถามตรงๆ ว่าทำไมผู้เขียนไม่ส่งมันไปยัง Git mailing list เพื่อพิจารณาใน upstream คำถามนี้เน้นย้ำถึงความปรารถนาทั่วไปในชุมชนนักพัฒนาที่อยากเห็นเครื่องมือสมัยใหม่ที่ปรับปรุงแล้วมาแทนที่การพัฒนาแบบเก่าในซอฟต์แวร์หลัก

อย่างไรก็ตาม ความเป็นจริงของการรวมเข้า upstream กลับซับซ้อนกว่านั้น แนวทางอนุรักษ์นิยมของโปรเจ็กต์ Git ต่อ dependencies ใหม่หมายความว่าการเพิ่ม Go เป็นความต้องการจะเผชิญกับความต่อต้านอย่างมาก ดังที่ผู้แสดงความเห็นคนหนึ่งกล่าวไว้ มันจะต้องใช้ความพยายามอย่างมากในการทำให้ผู้ดูแลเห็นพ้องต้องกันในการนำภาษาใหม่เข้ามา คล้ายกับความท้าทายที่เผชิญเมื่อเพิ่ม Rust เข้าไปใน Linux kernel

ข้อเสนอแนะให้เขียนใหม่ด้วย C แสดงให้เห็นถึงการตอบสนองทั่วไปในสถานการณ์เช่นนี้ แม้ว่าสิ่งนี้จะมีน้ำหนักมากกว่าการแปลภาษาอย่างง่าย การพัฒนาจะต้องรวมเข้ากับระบบสร้าง patch ที่มีอยู่ของ Git และรักษาความเข้ากันได้ข้ามแพลตฟอร์มที่รองรับทั้งหมด

ความสามารถของ Workflow ที่ปรับปรุงแล้ว

ฟีเจอร์เด่นของการพัฒนาด้วย Go นี้แก้ไขจุดเจ็บปวดของ workflow จริงๆ ระบบการกรองแบบ global ช่วยให้นักพัฒนาสามารถค้นหาการเปลี่ยนแปลงประเภทเฉพาะข้ามชุดการเปลี่ยนแปลงทั้งหมดได้อย่างรวดเร็ว ตัวอย่างเช่น การกรองหา TODO comments หรือ console.log statements สามารถช่วยนักพัฒนา stage การเปลี่ยนแปลงที่เกี่ยวข้องเข้าด้วยกัน โดยไม่คำนึงว่าไฟล์ใดจะมีสิ่งเหล่านั้น

ฟีเจอร์ auto-splitting นำความสามารถการแบ่ง hunk ที่มีอยู่ของ Git ไปสู่ข้อสรุปเชิงตรรกะ โดยแบ่งการเปลี่ยンแปลงโดยอัตโนมัติให้ละเอียดที่สุดเท่าที่จะเป็นไปได้ เมื่อรวมกับฟีเจอร์ bulk accept แล้ว สิ่งนี้สร้างการผสมผสาน workflow ที่ทรงพลังซึ่งเป็นไปไม่ได้กับการพัฒนาด้วย Perl แบบเดิม

โหมด Patch ที่รองรับ:

  • โหมด Stage: git add -p หรือ git add --patch
  • โหมด Reset: git reset -p
  • โหมด Checkout: git checkout -p
  • การดำเนินการ Stash และ worktree
  • ทุกโหมดรองรับฟีเจอร์การกรองและแยกส่วนที่ได้รับการปรับปรุงแล้ว

เครื่องมือทางเลือกและระบบนิเวศ

การอภิปรายยังเผยให้เห็นระบบนิเวศที่หลากหลายของเครื่องมือปรับปรุง Git ที่นักพัฒนาพึ่งพา สมาชิกชุมชนหลายคนกล่าวถึงทางเลือกที่พวกเขาชอบ รวมถึง tig ที่มีมายาวนานสำหรับการดำเนินการ Git แบบ terminal และ scmpuff สำหรับ staging workflows ที่ปรับปรุงแล้ว สิ่งนี้แสดงให้เห็นว่าแม้เครื่องมือ Git มาตรฐานจะทำงานได้ แต่ก็มีความต้องการประสบการณ์ผู้ใช้ที่ดีขึ้นอย่างชัดเจน

การตอบสนองอย่างตลกขบขันของผู้เขียนเกี่ยวกับการกลับมาพิจารณาการรวมเข้า upstream ในปี 2045 สะท้อนถึงไทม์ไลน์ที่เป็นจริงสำหรับการเปลี่ยนแปลงใหญ่ต่อฟังก์ชันหลักของ Git ในขณะที่ยังคงแสดงความสนใจอย่างแท้จริงในการแทนที่เวอร์ชัน upstream ในที่สุด

วิธีการติดตั้ง:

  • การ build โดยตรง: go build
  • ติดตั้งเป็นคำสั่ง Git : go build -o "$(go env GOPATH)/bin/git-add-interactive"
  • เพิ่มเข้าไปใน Git exec path: export GIT_EXEC_PATH="$(go env GOPATH)/bin:$GIT_EXEC_PATH"
  • การตรวจสอบ: which git-add-interactive และทดสอบด้วย git add -i

มองไปข้างหน้า

โปรเจ็กต์นี้เป็นมากกว่าแค่เครื่องมือ Git อีกตัวหนึ่ง มันแสดงให้เห็นว่าการพัฒนาสมัยใหม่สามารถปรับปรุง workflow ที่คุ้นเคยได้อย่างไรในขณะที่ยังคงความเข้ากันได้ ความสนใจทันทีของชุมชนในการรวมเข้า upstream แสดงให้เห็นว่ามีความต้องการจริงสำหรับการปรับปรุงเหล่านี้ให้ไปถึงผู้ใช้ Git ทุกคน ไม่ใช่แค่ผู้ที่เต็มใจติดตั้งเครื่องมือเพิ่มเติม

ไม่ว่าจะผ่านการยอมรับใน upstream ในที่สุดหรือการพัฒนาต่อเนื่องในฐานะเครื่องมือแยกต่างหาก การพัฒนาด้วย Go นี้เน้นย้ำถึงวิวัฒนาการอย่างต่อเนื่องของเครื่องมือนักพัฒนาและความปรารถนาของชุมชนสำหรับ workflow ที่ปรับปรุงและมีประสิทธิภาพ

อ้างอิง: Git Add Interactive (Go Implementation)