- พบคำสั่งง่าย ๆ สำหรับแก้ปัญหา การจัดการ Git branch เก่า ในเอกสารพัฒนาภายในของ CIA
git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
- คำสั่งนี้จะลบ branch ที่ merge แล้วทั้งหมดแบบรวดเดียว โดย ยกเว้น branch ปัจจุบันและ master จากผลลัพธ์ของ
git branch --merged
- ยังมีเวอร์ชันที่ปรับให้เข้ากับโปรเจ็กต์สมัยใหม่ โดยยกเว้น branch
main และ develop ด้วย
- สามารถ ลงทะเบียนเป็น Git alias เพื่อทำงานซ้ำ ๆ ให้เป็นอัตโนมัติได้ เป็นเครื่องมือที่เรียบง่ายแต่มีประโยชน์ต่อ การเพิ่มประสิทธิภาพการทำงานอย่างต่อเนื่อง และการจัดระเบียบ repository
เคล็ดลับ Git ที่พบใน Vault7
- เอกสาร Vault7 ที่ WikiLeaks เปิดเผยในปี 2017 มีทั้งเครื่องมือแฮ็กของ CIA และเอกสารพัฒนาภายใน
- ในบรรดาเอกสารเหล่านั้น มีหน้าหนึ่งที่รวบรวม เคล็ดลับและทริกเกี่ยวกับ Git ซึ่งส่วนใหญ่เป็นเรื่องทั่วไป เช่น การแก้ไข commit, การใช้ stash และ bisect
- คำสั่งบรรทัดเดียวที่พบในเอกสารนั้นยังคงอยู่ใน
~/.zshrc ของผู้เขียนมาจนถึงทุกวันนี้
ปัญหาการจัดการ branch เก่า
- ใน local Git repository เมื่อเวลาผ่านไป branch ที่ merge แล้วจะสะสมเพิ่มขึ้น ทำให้จัดการได้ยาก
- ไม่ว่าจะเป็น feature branch, hotfix หรือ branch สำหรับการทดลอง มักยังคงค้างอยู่หลัง merge ทำให้รายการจาก
git branch ดูรกและซับซ้อน
- แม้จะใช้คำสั่ง
git branch --merged เพื่อตรวจสอบ branch ที่ merge แล้วได้ แต่ การลบทีละอันด้วยมือเป็นเรื่องยุ่งยาก
คำสั่งต้นฉบับจากเอกสาร CIA
เวอร์ชันคำสั่งที่ปรับให้ทันสมัย
- เนื่องจากโปรเจ็กต์ส่วนใหญ่ใช้ branch
main จึงสามารถปรับคำสั่งได้ดังนี้
git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d
- เมื่อรันจาก branch
main หลัง deploy แล้ว จำนวน branch สามารถลดจากหลายสิบเหลือเพียงไม่กี่อัน
- ยังสามารถลงทะเบียนคำสั่งนี้เป็น Git alias เพื่อเรียกใช้งานได้สะดวก
alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'
- หลังจากนั้น เพียงพิมพ์คำสั่ง
ciaclean ใน repository ก็จะจัดการให้อัตโนมัติ
ประสิทธิภาพและการใช้งานจริง
- คำสั่งนี้ช่วย ประหยัดเวลาได้หลายนาทีในแต่ละสัปดาห์ และช่วยให้รายการ branch เป็นระเบียบอยู่เสมอ
- แม้จะเรียบง่าย แต่ก็ถือเป็นเครื่องมือที่ใช้งานได้จริงและช่วย เพิ่มผลิตภาพอย่างต่อเนื่อง
4 ความคิดเห็น
มีคนในคอมเมนต์ HN บอกว่าเขาใช้โปรแกรมที่ผมเคยทำด้วย
ผมเองก็ตั้ง alias ชื่อ
git goneไว้ใช้เหมือนกันครับ สะดวกมาก- alias.gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 == "[gone]" {print $1}' | xargs -r git branch -D
ผมไม่ได้ใช้ git แบบล้วน ๆ แต่ใช้เครื่องมือชื่อ gh-poi สำหรับจัดการอยู่ครับ
https://github.com/seachicken/gh-poi
ความคิดเห็นจาก Hacker News
ฉันใช้ alias ชื่อ
git tidyเพื่อจัดการกิ่งโดยจะไม่ลบกิ่งหลัก (main, master) และจะไม่แตะกิ่งปัจจุบันหรือกิ่งของ worktree อื่นด้วย
กิ่งที่หายไปจากรีโมตก็จะถูกลบอัตโนมัติ และมีโค้ดอยู่ใน การตั้งค่า dotfiles ของฉัน
init.defaultBranchมีความเสี่ยง เพราะชื่อกิ่งหลักอาจต่างกันไปในแต่ละรีโพซิทอรี และค่านี้เป็นการตั้งค่าระดับโกลบอลจึงต้องกำหนดล่วงหน้าฉันเลยสร้าง alias ชื่อ
git defaultให้ค้นหากิ่งหลักจริงจากรีโมต (origin) แบบอัตโนมัติฉันใช้ คำสั่ง cleanup ที่ผสานกับ
fzfสามารถเลือกกิ่งที่ merge แล้วล่วงหน้าแล้วลบทีเดียวได้ และถ้าต้องการก็ยกเว้นบางกิ่งออกได้
มันจัดการกิ่งรีโมตไปพร้อมกันด้วย และมีโค้ดอยู่ใน การตั้งค่า .gitconfig ของฉัน
อีกทั้งยังใช้ตัวแปร
user.primaryBranchเพื่อกำหนดกิ่งหลักที่ต่างกันในแต่ละรีโพซิทอรีinit.defaultBranchแทนก็น่าจะได้เหมือนกัน ถึงจะเป็นรีโพซิทอรีที่ init ไปแล้วก็ยังใช้git config --local init.defaultBranch mainเพื่อตั้งค่าได้git pull origin main:mainแล้วค่อยgit rebase maingit branch --mergedใช้งานได้ไม่ดีในรีโพซิทอรีที่ใช้ squash mergeเพราะ SHA ของ commit ที่ถูก squash จะต่างจาก HEAD ของกิ่งเดิม
เลยสงสัยว่ามีเครื่องมือที่ตรวจจับกิ่งที่ถูก squash อย่างปลอดภัยได้หรือไม่
มันไม่สมบูรณ์แบบ แต่ใช้งานได้จริงพอสมควร และจะแสดง prompt ยืนยันก่อนลบเสมอ
อ้างอิง การตั้งค่าลบกิ่งอัตโนมัติของ GitHub
ส่วนใหญ่จึงจัดการโดยผูก hook กับอีเวนต์ลบกิ่งบนรีโมต
ใช้ alias ชื่อ
git goneเพื่อรันgit fetch -pแล้วจัดการกิ่งที่มีสถานะ[gone]เลยใช้ สคริปต์ ที่ผสมสามวิธีคือ
git branch --merged,git cherry,git log grepแต่ถ้า commit ถูก amend หรือมีหลาย commit ก็อาจเกิดการตรวจจับผิดได้
ฉันใช้ alias ชื่อ
git lintเพื่อจัดการกิ่งที่ merge แล้วมันจะยกเว้นกิ่ง main, master, stable ไม่ลบ และฉันใช้คู่กับ
git pull --prune && git lintบ่อย ๆตัวคำสั่ง Git เองก็ธรรมดา แต่สิ่งที่น่าสนใจคือดันคลิกไปเจอเอกสารจาก Wikileaks
โครงการ “Fine Dining” ของ CIA เป็นเครื่องมือปลอมมัลแวร์ที่ซ่อนใน USB ให้ดูเหมือนแอป
จริง ๆ ปัญหาตั้งต้นอาจแก้ได้ง่าย ๆ แค่แสดง รายการกิ่งที่ยังไม่ถูก merge ออกมาก็พอ
มันแปลกที่งานซึ่งดูเป็นธรรมชาติแบบนี้กลับต้องใช้ bash หลายบรรทัด
ทั้งที่โค้ดเบสของ Git ใหญ่มาก แต่กลับไม่มีเป็นฟีเจอร์พื้นฐานให้ใช้ น่าเสียดาย
ดู บทความบล็อกที่เกี่ยวข้อง ได้ด้วย
xargsหรือ for loop สักหน่อย เรื่องพวกนี้ก็เล็กน้อยมากถ้าจะทำเป็นคำสั่ง built-in จริง ๆ ต้องรองรับกรณียกเว้นหลากหลายแบบ ซึ่งอาจยิ่งทำให้ซับซ้อน
สุดท้ายก็มีคนตอบทำนองว่า “ดูเหมือนเพิ่งหัดใช้ xargs”
เมื่อก่อนฉันเองก็เรียนรู้เรื่องพวกนี้จากบล็อกหรือบทความเหมือนกัน
ช่วงนี้ฉัน ติด TUI มาก ถ้าอะไรใช้งานไม่สะดวกก็จะขอให้ Claude-code สร้าง TUI ให้
ฉันทำ TUI สำหรับจัดการ Git worktree ด้วยไลบรารี Textual และ Claude ก็จัดการโค้ด Python ได้ค่อนข้างดี
tigซึ่งเป็น Git TUI รุ่นเก่า และเหมาะสำหรับหาแรงบันดาลใจด้วยบทความเกี่ยวกับฟีเจอร์ rebase ของ Magit ก็น่าอ่าน
ฉันก็ทำอะไรคล้าย ๆ กันไว้ใน Fish shell
เป็นฟังก์ชันที่ใช้
fzfเลือกกิ่งที่หายไปจากรีโมตแล้วลบมีอยู่ใน โค้ด dotfiles ของฉัน