Как справиться с ошибкой git gc fatal: bad object 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

работал без жалоб; У меня проблем не было.


7
Это сработало для меня, и я думаю, что я столкнулся с этой проблемой, потому что я изменил ветку по умолчанию с masterдругой, называемой develop. За несколько дней до того, как я вернул его обратно с developна, masterи я удалил старую ветку по умолчаниюdevelop , но в моем рабочем каталоге файл .git/refs/remotes/origin/HEADвсе еще указывал на то, refs/remotes/origin/developчего больше не существует. В этой ситуации удаление файла сработало.
Ставаренго

4
git pruneсработал для меня, способ удалить данные, которые накопились в Git, но на которые не ссылается ничего полезного.
Sven Malvik

$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
Их казнь

2
Я подозреваю, что лучшим способом будет ответ @WilQu ( stackoverflow.com/a/49944297/660339 ). Кто-нибудь может это подтвердить?
Иван Перес

удаление этого файла из папки .git, что git gcсработало для меня
Vino

69

Проблема, с которой я столкнулся (та же проблема, что и @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
Это тоже было моим исправлением
Дэн Карлштедт

1
Это было мое точное решение. Наша команда недавно перешла от использования ветки по умолчанию для разработки к мастеру
jmancherje

41

Увидев ответ Трентона, я посмотрел на свой .git/refs/remotes/origin/HEADи увидел, что он также указывает на старую ветку, которая теперь удалена.

Но вместо того, чтобы самому редактировать файл, я попробовал решение Райана:

git remote set-head origin --auto

Он автоматически установил файл в новую ветку и git gcпосле этого работал нормально.


Да, это работает для меня - поскольку я был в том же сценарии. git remote set-head $REMOTE --autoв моем случае $ REMOTE - это удаленный псевдоним, а не "origin" по умолчанию, потому что у меня установлено несколько пультов.
Деви

29

Я думал, что решение было следующим, поскольку это, казалось, сработало, но оказалось, что на самом деле проблема не решена.

git remote set-head origin --auto

1
Похоже, эта команда помогла мне избавиться от той же проблемы. Однако после этой команды я также использовал git prune(как рекомендовалось в первом выводе команды), поэтому я не могу точно сказать, что мне помогло - первое, второе или оба.
Борис Пылгун

1
git remote set-head origin --autoисправил мой файл refs / remotes / origin / HEAD без необходимости использовать меняgit prune
danio

Я столкнулся с этой ошибкой:, error: Multiple remote HEAD branches. Please choose one explicitlyи мне пришлось использовать git remote set-head origin mybranch(в то время как ветка mybranch была проверена), чтобы ошибка исчезла.
derekmx271

3
Голосование против не является полным ответом и может ввести в заблуждение.
Christian

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. Когда папка была распакована, это повредило файлы пакета, вызвав каскад других странных проблем, таких как невозможность удалить несуществующие ветки.

Единственным исправлением было стереть рабочий каталог и снова клонировать удаленные репо. К счастью, я все еще мог нажимать и получать обновления, чтобы ничего не потерялось. Теперь все хорошо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.