ปกติฉันจะไม่ตอบคำถามที่มี 16 คำตอบอยู่แล้ว แต่คำตอบอื่น ๆ ทั้งหมดนั้นผิดและคำตอบที่ถูกต้องนั้นง่ายมาก คำถามกล่าวว่า "มีวิธีง่ายๆในการลบสาขาการติดตามทั้งหมดที่มีการเทียบระยะไกลไม่อยู่อีกต่อไปหรือไม่"
หาก "ง่าย" หมายถึงการลบพวกเขาทั้งหมดในครั้งเดียวไม่บอบบางไม่เป็นอันตรายและไม่ต้องพึ่งพาเครื่องมือที่ผู้อ่านไม่ทุกคนจะมีคำตอบที่ถูกต้องคือ: ไม่
คำตอบบางคำตอบนั้นง่าย แต่พวกเขาไม่ได้ทำในสิ่งที่ถูกถาม คนอื่นทำในสิ่งที่ถูกถาม แต่ไม่ง่าย: ทั้งหมดพึ่งพาการแยกวิเคราะห์ Git ผ่านคำสั่งการจัดการข้อความหรือภาษาสคริปต์ซึ่งอาจไม่ปรากฏในทุกระบบ ยิ่งไปกว่านั้นคำแนะนำส่วนใหญ่ใช้คำสั่ง Porcelain ซึ่งเอาต์พุตไม่ได้รับการออกแบบให้แยกวิเคราะห์โดยสคริปต์ ("Porcelain" หมายถึงคำสั่งที่มีไว้สำหรับการทำงานของมนุษย์สคริปต์ควรใช้คำสั่ง "plumbing" ระดับต่ำกว่า)
อ่านเพิ่มเติม:
หากคุณต้องการทำสิ่งนี้อย่างปลอดภัยสำหรับกรณีการใช้งานในคำถาม (สาขาการติดตามการเก็บรวบรวมขยะที่ถูกลบบนเซิร์ฟเวอร์ แต่ยังคงมีอยู่ในสาขาท้องถิ่น) และด้วยคำสั่ง Git ระดับสูงเท่านั้นคุณต้อง
git fetch --prune
(หรือgit fetch -p
ซึ่งเป็นนามแฝงหรือgit prune remote origin
ทำสิ่งเดียวกันโดยไม่ดึงข้อมูลและอาจไม่ใช่สิ่งที่คุณต้องการเป็นส่วนใหญ่)
- โปรดทราบว่าสาขาระยะไกลใด ๆ ที่ถูกรายงานว่าถูกลบ หรือเพื่อค้นหาในภายหลัง
git branch -v
(สาขาติดตามเด็กกำพร้าใด ๆ จะถูกทำเครื่องหมาย "[หายไป]")
git branch -d [branch_name]
ในแต่ละสาขาการติดตามกำพร้า
(ซึ่งเป็นคำตอบอื่น ๆ ที่เสนอ)
ถ้าคุณต้องการสคริปต์วิธีการแก้ปัญหาก็for-each-ref
คือจุดเริ่มต้นของคุณเช่นเดียวกับคำตอบของ Mark Longairที่นี่และคำตอบของคำถามอื่นแต่ฉันไม่เห็นวิธีที่จะใช้ประโยชน์จากมันโดยไม่ต้องเขียน shell script loop หรือใช้ xargs หรืออะไรบางอย่าง .
คำอธิบายพื้นหลัง
เพื่อให้เข้าใจถึงสิ่งที่เกิดขึ้นคุณต้องชื่นชมว่าในสถานการณ์การติดตามสาขาคุณไม่มีสาขาเดียว แต่มีสามสาขา (และจำได้ว่า "สาขา" หมายถึงเพียงตัวชี้ไปยังการกระทำ)
ที่กำหนดให้สาขาการติดตามfeature/X
, พื้นที่เก็บข้อมูลระยะไกล (เซิร์ฟเวอร์) feature/X
จะมีสาขานี้และเรียกมันว่า ที่เก็บในเครื่องของคุณมีสาขาremotes/origin/feature/X
ซึ่งหมายความว่า "นี่คือสิ่งที่รีโมทบอกฉันถึงคุณสมบัติ / สาขา X เป็นครั้งสุดท้ายที่เราพูดคุยกัน" และสุดท้ายพื้นที่เก็บข้อมูลในท้องถิ่นมีสาขาfeature/X
ที่ชี้ไปที่การกระทำล่าสุดของคุณและกำหนดค่าให้ "ติดตาม"remotes/origin/feature/X
ซึ่งหมายความว่าคุณสามารถดึงและดันเพื่อจัดตำแหน่งให้อยู่ในแนวเดียวกัน
ณ จุดหนึ่งมีคนลบfeature/X
บนระยะไกล จากช่วงเวลานั้นคุณเหลืออยู่กับท้องถิ่นของคุณfeature/X
(ซึ่งคุณอาจไม่ต้องการอีกต่อไปเนื่องจากการทำงานในคุณสมบัติ X เสร็จสิ้นแล้ว) และสิ่งที่คุณremotes/origin/feature/X
ไม่มีประโยชน์อย่างแน่นอนเพราะวัตถุประสงค์เพียงอย่างเดียวคือเพื่อจดจำสถานะของเซิร์ฟเวอร์สาขา .
และ Git จะช่วยให้คุณล้างข้อมูลซ้ำซ้อนโดยอัตโนมัติremotes/origin/feature/X
- นั่นคือสิ่งที่git fetch --prune
- แต่ด้วยเหตุผลบางอย่างมันไม่อนุญาตให้คุณลบข้อมูลของคุณเองโดยอัตโนมัติfeature/X
... แม้ว่าคุณจะfeature/X
ยังมีข้อมูลการติดตามเด็กกำพร้าอยู่ก็ตาม เพื่อระบุสาขาการติดตามเดิมที่ถูกผสานอย่างสมบูรณ์ (หลังจากที่ทุกคนก็สามารถให้คุณข้อมูลที่ช่วยให้คุณสามารถดำเนินการด้วยมือตัวเอง.)
* master
ในระบบของฉัน คำสั่งต่อไปนี้ใช้งานได้สำหรับฉัน:git branch -d $(git branch --merged |tail -n +2)