วิธีจัดการ git gc fatal: ข้อผิดพลาด refs / remotes / origin / HEAD ไม่ดี


131

ผมสุ่มตีในวันนี้ในขณะที่พยายามที่จะใช้ Git ขยะเก็บ :

$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

ฉันจะจัดการกับปัญหานี้ได้อย่างไร?

คำตอบ:


163

ฉันไม่เข้าใจความแตกต่างของสิ่งนี้ แต่ตามที่แนะนำในหัวข้อนี้เมื่อฉันพบสิ่งนี้ฉันเพิ่งทำ

$ mv .git/refs/remotes/origin/HEAD /tmp

(เก็บไว้รอบ ๆ ในกรณี) แล้ว

$ git gc

ทำงานโดยไม่บ่น ฉันไม่พบปัญหาใด ๆ


6
มันทำงานสำหรับฉันและฉันคิดว่าฉันได้เป็นปัญหานี้เพราะผมเปลี่ยนสาขาเริ่มต้นจากการไปยังอีกที่หนึ่งที่เรียกว่าmaster developหลายวันก่อนที่ฉันจะเปลี่ยนกลับจากdevelopเป็นmasterและฉันลบสาขาเริ่มต้นเก่าdevelopแต่ในไดเร็กทอรีการทำงานของฉันไฟล์.git/refs/remotes/origin/HEADยังคงชี้ไปrefs/remotes/origin/developที่ไม่มีอยู่แล้ว ในสถานการณ์นี้การลบไฟล์ได้ผล
Stavarengo

4
git pruneได้ผลสำหรับฉันวิธีลบข้อมูลที่สะสมใน Git แต่ไม่ได้รับการอ้างอิงจากสิ่งที่เป็นประโยชน์
Sven Malvik

การดำเนินการเหล่านี้ช่วยแก้ปัญหาของฉันได้:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
David Rauca

2
ฉันสงสัยว่าวิธีที่ดีที่สุดน่าจะเป็นคำตอบของ @ WilQu ( stackoverflow.com/a/49944297/660339 ) ใครสามารถยืนยันเรื่องนี้?
Ivan Perez

การลบไฟล์เหล่านั้นออกจากโฟลเดอร์. git ทำได้ดีกว่าgit gcสำหรับฉัน
Vino

68

ปัญหาที่ฉันพบ (ซึ่งเป็นปัญหาเดียวกับที่ @Stavarengo กล่าวถึงในความคิดเห็นนี้ด้านบน) คือสาขาระยะไกลเริ่มต้น ( developในกรณีของฉัน) ถูกลบไปแล้ว แต่ยังคงอ้างถึงใน.git/refs/remotes/origin/HEAD.

การเปิด.git/refs/remotes/origin/HEADในโปรแกรมแก้ไขของฉันแสดงให้เห็นสิ่งนี้:

ref: refs/remotes/origin/develop

ฉันแก้ไขอย่างระมัดระวังเพื่อชี้ไปที่สาขาเริ่มต้นใหม่ของฉันและทุกอย่างเรียบร้อยดี:

ref: refs/remotes/origin/master

เบาะแสที่ทำให้ฉันหายไปคือการวิ่งgit pruneแสดงข้อผิดพลาดนี้:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD

1
นั่นคือการแก้ไขของฉันเช่นกัน
Dan Carlstedt

1
นี่คือทางออกที่แน่นอนของฉัน ทีมของเราเพิ่งเปลี่ยนจากการใช้การพัฒนาสาขาเริ่มต้นเป็นแบบมาสเตอร์เช่นกัน
jmancherje

40

หลังจากเห็นคำตอบของเทรนตันฉันก็มองไปที่ .git/refs/remotes/origin/HEADและเห็นว่ามันชี้ไปที่สาขาเก่าที่ตอนนี้ถูกลบไปแล้ว

แต่แทนที่จะแก้ไขไฟล์ด้วยตัวเองฉันลองใช้วิธีแก้ปัญหาของ Ryan:

git remote set-head origin --auto

มันตั้งค่าไฟล์เป็นสาขาใหม่โดยอัตโนมัติและgit gcทำงานได้ดีหลังจากนั้น


ใช่สิ่งนี้ใช้ได้กับฉัน - เหมือนที่ฉันอยู่ในสถานการณ์เดียวกัน git remote set-head $REMOTE --autoในกรณีของฉัน $ REMOTE เป็นนามแฝงระยะไกลไม่ใช่ "ต้นทาง" เริ่มต้นเนื่องจากฉันมีการตั้งค่ารีโมตหลายรายการ
Devy

29

ฉันคิดว่าวิธีแก้ปัญหามีดังต่อไปนี้เนื่องจากดูเหมือนจะได้ผล แต่ปรากฎว่าไม่สามารถแก้ปัญหาได้จริง

git remote set-head origin --auto

1
ดูเหมือนว่าคำสั่งนี้จะช่วยฉันกำจัดปัญหาเดิม ๆ อย่างไรก็ตามหลังจากคำสั่งนี้ฉันยังใช้git prune(ตามที่แนะนำในเอาต์พุตคำสั่งแรก) ดังนั้นฉันจึงไม่สามารถบอกได้อย่างชัดเจนว่าอะไรช่วยฉันได้บ้าง - อันดับแรกวินาทีหรือทั้งสองอย่าง
Borys Pylhun

1
git remote set-head origin --autoแก้ไขไฟล์อ้างอิง / รีโมท / ต้นทาง / HEAD โดยที่ฉันไม่ต้องใช้git prune
danio

ฉันพบข้อผิดพลาดนี้: error: Multiple remote HEAD branches. Please choose one explicitlyและต้องใช้git remote set-head origin mybranch(ในขณะที่สาขา 'mybranch' กำลังชำระเงิน) เพื่อให้ข้อผิดพลาดหายไป
derekmx271

3
การลงคะแนนเนื่องจากไม่ใช่คำตอบที่สมบูรณ์และอาจทำให้เข้าใจผิดได้
Christian Vielma

9

ดูเหมือนว่าการอ้างอิงสัญลักษณ์ของคุณอาจจะเสีย ... ลองแทนที่ด้วยสาขาเริ่มต้นของคุณเช่นนี้ตัวอย่างเช่นสาขาเริ่มต้นของฉันคือmaster

$ git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
$ git fetch --prune
$ git gc

ที่ควรแก้ไข


0

หากคุณใช้ git worktrees ตรวจสอบให้แน่ใจว่าคุณกำลังทำไฟล์

git worktree prune

ก่อนวิ่ง

git gc

ฉันมีเวิร์กทรีเสียหายและดูเหมือนจะทำเคล็ดลับหลังจากลบเวิร์กทรีที่เสียหาย git pruneดูเหมือนจะไม่ได้ผล


0

สาเหตุของสิ่งนี้สำหรับฉันคือทำงานในโฟลเดอร์ที่บีบอัดใน Windows เมื่อโฟลเดอร์ไม่ถูกบีบอัดไฟล์แพ็คจะเสียหายซึ่งทำให้เกิดปัญหาแปลก ๆ อื่น ๆ เช่นไม่สามารถตัดกิ่งที่ไม่มีอยู่ได้

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

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