Сегодня я случайно попал в него при попытке запустить Git сборщик мусора:

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

Как с этим бороться?

Ryan

Ответы (10)

Похоже, что ваши символические ссылки могут быть сломаны ... Попробуйте заменить его веткой по умолчанию следующим образом: Например, моя ветка по умолчанию - master

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

Это должно исправить.

Если вы используете git worktrees, убедитесь, что вы используете

git worktree prune

перед запуском

git gc

У меня было повреждено рабочее дерево, и, похоже, это помогло после удаления поврежденного рабочего дерева.git prune сам по себе, похоже, не работал.

git update-ref -d [wrong reference here]

Это решит эту проблему.

Для вышеуказанной проблемы используйте следующий код:

git update-ref -d 'refs/remotes/origin/HEAD'

Если вы получаете сообщение об ошибке с .git, как показано ниже:

error: bad ref for .git/logs/refs/remotes/origin/Dec/session-dynatrace-logs 6

Вы можете скопировать путь, начиная с ссылок, как показано ниже:

git update-ref -d 'refs/remotes/origin/Dec/session-dynatrace-logs 6'

Причиной этого для меня была работа в сжатой папке в Windows. Когда папка была распакована, это повредило файлы пакета, вызвав каскад других странных проблем, таких как невозможность удалить несуществующие ветки.

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

Моя проблема возникла с конкретной веткой.
Видимо поврежден справочный файл для ветки. Я вот так исправил.

git checkout main
// Я удалил файл .git \ refs \ Heads \ branch_xpto
мерзавец тянуть
git checkout branch_xpto

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

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

git remote set-head origin --auto

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

Я не понимаю последствий этого, но, как было предложено в этой ветке, когда я столкнулся с этим, я только что сделал

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

(оставив на всякий случай), а затем

$ git gc

отработал без жалоб; Проблем не сталкивался.

Проблема, с которой я столкнулся (та же проблема, что @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

Слава богу, нашел вот это https://makandracards.com/chris-4/54101-fixing-a-git-repo

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

Это может произойти, если исходные ветки были удалены, и ваш источник указывает на них. Вы можете подтвердить это, запустив:

cat .git / refs / remotes / origin / HEAD

Если он указывает на несуществующую ветку, выполняется:

git remote set-head origin --auto

, за которым следует

git gc

исправит

Я столкнулся с этой ошибкой, потому что ветка по умолчанию была изменена с master на main. Чтобы решить эту проблему, я использовал комбинацию информации, приведенной в нескольких ответах выше:

cat .git / refs / remotes / origin / HEAD

Возвращено:

ссылка: refs / remotes / origin / master

Чтобы исправить, я запустил:

git symbolic-ref refs / remotes / origin / HEAD refs / remotes / origin / main

Я снова запустил это, чтобы перепроверить:

cat .git / refs / remotes / origin / HEAD

Что вернуло:

ссылка: refs / remotes / origin / main

Тогда git gc и git prune работали нормально.


Чтобы увидеть, что происходит, я также попробовал:

git источник удаленной настройки головок --auto

Что вернуло:

origin / HEAD установлено как main

И это действительно решает проблему, автоматически определяя реф.

2022 WebDevInsider