git ลบรีโมท: ไม่มีการอ้างอิงระยะไกล


107

ในระยะสั้น;

  • ฉันจะลบรีโมตที่ผสานระยะไกลหลายตัวได้อย่างไร

พื้นหลังเพิ่มเติม;

ฉันมี git repo ที่มีรีโมตหลายสิบตัวที่รวมเข้ากับมาสเตอร์แล้ว ฉันสามารถลบรีโมทเหล่านี้ทีละรายการโดยใช้:

git push --delete origin myBranch-1234

อย่างไรก็ตามนี่เป็นกระบวนการที่ช้าและน่าเบื่อสำหรับรีโมททั้งหมด ฉันลองใช้คำสั่งนี้:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedแสดงรายการรีโมทที่ผสานทั้งหมด
grep originบอกคำสั่งให้รวมจุดเริ่มต้น
grep -v masterบอกคำสั่งให้ยกเว้นต้นแบบ
xargs git push origin --deleteบอกคำสั่งให้ลบรายการรีโมท

เมื่อรวมกันแล้วฉันคาดหวังว่าสิ่งนี้จะรวบรวมรีโมทที่ผสานทั้งหมดและลบออก

เมื่อฉันเรียกใช้คำสั่งข้างต้นฉันจะได้รับสิ่งต่อไปนี้สำหรับทุกรีโมตที่ผสาน

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

อย่างไรก็ตามมีรีโมทเหล่านี้อยู่และฉันสามารถชำระเงินแต่ละอันได้ ไซต์และผู้คนจำนวนมากแนะนำให้ฉันเรียกใช้git fetch --pruneเพื่อล้างข้อมูลอ้างอิงที่ขาดหายไป สิ่งนี้ไม่ได้ทำอะไรเลยเนื่องจากมีรีโมทเหล่านี้อยู่

ดังนั้นฉันขอถามคุณที่รักการแลกเปลี่ยนกอง;

  • เหตุใดฉันจึงลบรีโมตได้ 1 อัน แต่ไม่มาก
  • คำสั่งของฉันถูกต้องหรือไม่?

ฉันคิดว่าฉันขาดอะไรเล็ก ๆ ทุกครั้งที่ค้นหาสิ่งนี้ดูเหมือนว่าฉันจะทำสิ่งนี้ถูกต้อง แต่ฉันได้รับข้อผิดพลาดข้างต้น

คำตอบ:


226

คุณอาจต้องตัด "แคช" ในเครื่องของสาขาระยะไกลก่อน ลองวิ่ง:

git fetch -p origin

ก่อนที่จะลบ


2
ที่แก้ไขให้ฉันขอบคุณ! แต่ทำไมมันไม่ปรับปรุงเมื่อฉันสามารถดึงข้อมูลโดยไม่--prune? ในความคิดของฉันมันค่อนข้างทำให้เข้าใจผิด
dave0688

6
เป็นเพียงบันทึกสำหรับผู้ที่มาถึงที่นี่จากการค้นหา - แม้ว่าสิ่งนี้จะมีประโยชน์อย่างชัดเจนสำหรับคนส่วนใหญ่ที่มาที่นี่ แต่ก็ไม่ถูกต้องในแง่ของปัญหาเดิม - ปัญหาของ OP คือคำสั่งของเขาไม่ถูกต้องรวมอยู่origin/ในชื่อสาขาตามที่อธิบายไว้ / แก้ไขในคำตอบอื่น ๆ
CupawnTae

104

สาขาเหล่านั้นถูกลบออกจากรีโมต (ต้นทาง) หรือไม่? ถ้าใช่คุณสามารถทำได้

git fetch --prune origin

มิฉะนั้นอาจส่งคืนแม้ว่าคุณจะลบทิ้งในเครื่องแล้วก็ตาม

อัปเดต:เมื่อดูคำสั่งของคุณอีกครั้งดูเหมือนว่าคุณกำลังสร้างคำสั่งไม่ถูกต้อง คุณอาจต้องการ

git push origin --delete myBranch-1234

แต่คุณกำลังทำสิ่งที่ชอบ

git push origin --delete origin/myBranch-1234

ไม่มีกิ่งก้านใดหลุดออกจากแหล่งกำเนิด ฉันสามารถชำระเงินใด ๆ ก็ได้
Jqw

1
ใช่เพราะคุณรันคำสั่งต่างกันในกรณีที่สอง
Mykola Gurov

1
ฉันไม่เข้าใจประเด็นของคุณ ฉันรู้ว่าฉันใช้สองคำสั่งที่แตกต่างกัน กรณีที่สองจะได้รับรีโมทรวมทั้งหมดที่มีแล้วฉันพยายามที่จะลบพวกเขาด้วยgit branch -r --merged xargs git push origin --deleteคำสั่งกำลังพยายามลบรีโมตยกเว้นว่าจะคิดว่าไฟล์remote ref does not exist.
Jqw

1
ในคำสั่ง piped ที่สองของคุณให้ใส่เสียงสะท้อนถัดจากxargsเพื่อดูว่ามีการดำเนินการอะไรบ้าง
Mykola Gurov

2
@Jqw คุณไม่สามารถรวมคำนำหน้าชื่อสาขาที่คอมไพล์แล้วรู้ว่าคุณกำลังทำงานกับกิ่งต้นกำเนิดมาตั้งแต่ที่คุณกำลังทำงานorigin/ git push originข้อเสนอแนะ Mykola ก็คือการทำให้ส่วนสุดท้ายของคำสั่งมากกว่าxargs echo echo xargs [...]
Matthew อ่าน

15

ใช้sedเพื่อลบส่วน "ต้นกำเนิด /" และเปลี่ยนxargsส่วนlttile

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.