git remote prune - ไม่แสดงกิ่งก้านที่ถูกตัดออกมากเท่าที่ฉันคาดไว้


113

จากหน้าคน:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

ดังนั้นฉันจึงเอากิ่งก้านออกโดยใช้

git push origin :staleStuff

แล้วก็วิ่ง

git remote prune origin

อย่างไรก็ตามมีการตัดกิ่งในท้องถิ่นเพียงสาขาเดียว สาขาเหล่านี้บางแห่งสร้างขึ้นโดยฉันบางสาขาโดยเพื่อนร่วมงาน นี่แสดงว่าฉันไม่ได้ติดตามสาขาเหล่านั้นอย่างถูกต้องตั้งแต่แรกหรือไม่?


7
หากต้องการทราบว่าสาขาใดที่จะถูกลบออกคุณสามารถทำได้git remote show originและมองหาสาขาที่มีเครื่องหมายstale
ใครสักคนอยู่ที่ไหนสักแห่ง

คำตอบ:


189

เมื่อคุณใช้งานgit push origin :staleStuffระบบจะลบโดยอัตโนมัติorigin/staleStuffดังนั้นเมื่อคุณเรียกใช้git remote prune originคุณได้ตัดกิ่งบางส่วนที่ถูกคนอื่นลบออกไป มีโอกาสมากขึ้นที่เพื่อนร่วมงานของคุณจะต้องวิ่งgit pruneเพื่อกำจัดสาขาที่คุณย้ายออกไป


แล้วอะไรกันแน่git remote prune? แนวคิดหลัก: สาขาในพื้นที่ (ไม่ใช่การติดตามสาขา) ไม่ได้สัมผัสด้วยgit remote pruneคำสั่งและควรลบออกด้วยตนเอง

ตอนนี้ตัวอย่างในโลกแห่งความจริงเพื่อความเข้าใจที่ดีขึ้น:

คุณมีที่เก็บระยะไกลที่มี 2 สาขา: masterและfeature. สมมติว่าคุณกำลังทำงานในทั้งสองสาขาดังนั้นคุณจึงมีการอ้างอิงเหล่านี้ในที่เก็บในเครื่องของคุณ (มีการตั้งชื่ออ้างอิงแบบเต็มเพื่อหลีกเลี่ยงความสับสน):

  • refs/heads/master(ชื่อย่อmaster)
  • refs/heads/feature(ชื่อย่อfeature)
  • refs/remotes/origin/master(ชื่อย่อorigin/master)
  • refs/remotes/origin/feature(ชื่อย่อorigin/feature)

ตอนนี้สถานการณ์ทั่วไป:

  1. นักพัฒนารายอื่นบางรายทำงานเสร็จทั้งหมดfeatureรวมเข้าด้วยกันmasterและลบfeatureสาขาออกจากที่เก็บระยะไกล
  2. โดยค่าเริ่มต้นเมื่อคุณทำgit fetch(หรือgit pull) จะไม่มีการลบการอ้างอิงออกจากที่เก็บในเครื่องของคุณดังนั้นคุณยังคงมีการอ้างอิงทั้งหมด 4 รายการ
  3. git remote prune originคุณตัดสินใจที่จะทำความสะอาดพวกเขาขึ้นและวิ่ง
  4. git ตรวจพบว่าfeatureไม่มีสาขาอีกต่อไปดังนั้นจึงrefs/remotes/origin/featureเป็นสาขาเก่าที่ควรลบออก
  5. ตอนนี้คุณมีข้อมูลอ้างอิง 3 รายการรวมถึงrefs/heads/featureเนื่องจากgit remote pruneไม่ได้ลบrefs/heads/*การอ้างอิงใด ๆ

เป็นไปได้ที่จะระบุสาขาในพื้นที่ซึ่งเชื่อมโยงกับสาขาการติดตามระยะไกลโดยbranch.<branch_name>.mergeพารามิเตอร์การกำหนดค่า พารามิเตอร์นี้ไม่จำเป็นสำหรับสิ่งใดในการทำงาน (อาจยกเว้นgit pull) ดังนั้นพารามิเตอร์นี้จึงอาจหายไป

(อัปเดตด้วยตัวอย่างและข้อมูลที่เป็นประโยชน์จากความคิดเห็น)


ฉันเข้าใจสถานการณ์ที่จะเป็น: สาขายังคงมีอยู่ในเครื่อง แต่ถูกลบออกจาก repo ระยะไกล ตอนนี้ฉันต้องการลบสาขาท้องถิ่นทั้งหมดที่ไม่มีอยู่บนรีโมทดังนั้นฉันจึงเรียกใช้ git prune นั่นคือสิ่งที่ "กิ่งไม้เก่าเหล่านี้ถูกลบออกจากที่เก็บระยะไกลแล้ว" บอกกับฉัน ฉันผิดเหรอ?
Felixyz

3
คุณมีสิทธิ แต่คุณอาจจะเข้าใจผิดความหมายของ "สาขาท้องถิ่น" git pruneในกรณีของ เฉพาะสาขาในเท่านั้น/refs/remotes/<remote_name>/ที่ต้องตัดแต่งกิ่ง สาขาใด ๆ ใน/refs/heads/จะไม่ถูกแตะต้อง - คุณต้องจัดการสิ่งเหล่านี้ด้วยตนเอง
สูงสุด

Aha นั่นคือสิ่งที่ฉันคิดจริงๆ ดังนั้นจึงไม่มีวิธีทำในสิ่งที่ฉันต้องการ: ลบสาขาทั้งหมดในหัวที่ติดตามสาขาระยะไกลโดยอัตโนมัติโดยตรวจสอบว่าสาขาระยะไกลเหล่านั้นถูกลบหรือไม่?
Felixyz

2
ไม่มีคำสั่งในตัวสำหรับสิ่งนั้น แต่คุณสามารถเขียนสคริปต์ดังกล่าวด้วยตัวเอง สาขาการติดตามสามารถระบุได้โดยการมีอยู่ของbranch.<branch_name>.mergeพารามิเตอร์ config
สูงสุด

คำตอบนี้จะดีกว่าถ้าคุณเพิ่มข้อมูลในความคิดเห็นลงในคำตอบเพื่อให้ทุกคนที่มาที่นี่และมีความเข้าใจผิดเช่นเดียวกับ @Felixyz ไม่ต้องมองว่าคำตอบของคุณเป็นเรื่องตลกแล้วอ่านความคิดเห็นเพื่อทำความเข้าใจในที่สุด .
Akrikos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.