Как справиться с этой ошибкой git

Я получаю эту ошибку в моем репозитории git:

22:09:15 $ git status
# On branch master
error: Could not read 8124cc15c63be92d534e4cdfa33c38d54deee122
error: unable to read tree object HEAD
nothing to commit (working directory clean)

Поиск Google error: unable to read tree object HEAD не приводит к большой помощи, эта ошибка кажется очень редкими. Я не уверен, как с этим бороться. Это может быть сбой жесткого диска?

Edit: Выходной сигнал git fsck следующий:

broken link from  commit 607328dc80e4901a55b95c683d4fbf43e6df28bf
              to    tree 8124cc15c63be92d534e4cdfa33c38d54deee122
missing tree 8124cc15c63be92d534e4cdfa33c38d54deee122
dangling tree 56b5d4a5e429d251582ec927bca7ef1225510c41
dangling tree 0259d2d38b18b6136bb6070fb41faf3624453cc6

Ответ 1

В сообщении с "сломанной ссылкой" вы можете следовать рекомендациям GitFaq:

  • создайте резервную копию всего своего состояния, чтобы все, что вы делаете, можно было выполнить, если вы повредили больше!
  • взорвать любые поврежденные пакеты файлы
    • См. "man git-unpack-objects" и, в частности, флаг "-r".
      Кроме того, имейте в виду, что он только распаковывает объекты, которые еще не доступны, поэтому сначала нужно перенести пакетный файл с его обычного местоположения (иначе git-unpack-objects найдет все объекты, которые находятся в пакетном файле в пакете -file, а не распаковать что-либо вообще)
  • заменить любые сломанные и/или отсутствующие объекты
    • Это сложная часть.
      Иногда (надеюсь, часто!) Вы можете найти недостающие объекты в других копиях репозиториев.
      В других случаях вам может понадобиться попытаться найти данные по-другому (например, возможно, ваша извлеченная копия содержит содержимое файла, которое, когда хеширование будет отсутствующим объектом?).
  • убедитесь, что все довольны "git fsck --full"
  • переупаковать все, чтобы снова вернуться в эффективное состояние.

Примечания:

Обновление июля 2016 года (7 лет), при этом Git 2.10 скоро выйдет, теперь у вас есть:

git fsck --name-objects

Он помогает называть происхождение этих сломанных ссылок

См. "Как исправить ошибку Git с ошибкой ссылки с дерева на дерево?".

Ответ 2

У меня была аналогичная проблема только сейчас. Коррупция возникла, когда мой ноутбук сделал жесткое отключение во время git pull. У меня есть резервный репозиторий. Сначала у меня было несколько объектных файлов в .git/objects/??/*, которые были нулевого размера. После резервной копии хранилища cp -a я сделал следующее:

  • удалить объекты с нулевой длиной
  • клонировать удаленный репозиторий в репозиторий ../fresh/
  • в сломанном репозитории, я сделал

    cat ../fresh/.git/objects/pack/pack-*.pack | git unpack-objects

Это заполнило недостающие объекты в базе данных объектов. Кажется, что хранилище резервное копирование теперь.

Ответ 3

У меня была та же проблема. После много вытягивания волос я обнаружил, что это было причиной, изменив разрешение на репозиторий git файлов. Я решил это следующим образом:

$ cd .git
$ chmod 755 *

Готово!

Ответ 4

Я получил аналогичную ошибку в Homebrew устанавливает Git репозиторий. Вместо того, чтобы восстанавливать все недостающие объекты один за другим, мне было проще просто удалить каталог .git и создать его снова путем повторного клонирования из общедоступный репозиторий Homebrews. Это были мои шаги:

  • Проверьте, какая информация у вас в репозитории Git, которую вы не получите, просто повторно клонируя. Для меня это были частные ветки, приставки и пульты.
    • Преобразуйте stashes в реальные коммиты, создав новую ветку, применив stash и совершив что-то вроде "[WIP]" в имени, чтобы показать, что это задержка.
    • Сохраните ветки, которые не находятся на открытом пульте дистанционного управления, нажав их на свой собственный пульт. Это может быть fork репозитория на GitHub или просто новый репозиторий Git в другом месте на вашем компьютере.
    • Если у вас несколько удаленных, сохраните вывод git remote -v, который содержит имена и URL-адреса ваших пультов, поэтому вы можете вручную добавить их позже.
  • Удалите каталог repoistorys .git (или переименуйте его в .git-broken и удалите его позже). В командной строке это rm -rf .git.
  • Повторно клонировать удаленный каталог с помощью git clone https://github.com/Homebrew/homebrew.git или любого другого URI.
  • Это создаст новую подпапку homebrew, названную после репозитория. Вы хотите получить только каталог .git; ваши локальные файлы уже в порядке. Итак mv homebrew/.git .git, а затем удалите папку homebrew.
  • В вашем репозитории Git не должно быть ошибок, поскольку вы воссоздали его с нуля. Теперь просто восстановите любую информацию, сохраненную на первом шаге.
    • Если у вас есть дополнительные пульты, добавьте их снова с помощью git remote add <name> <url>.
    • Если вы создали резервную копию любых веток (или штампов, преобразованных в ветки) в удаленный репозиторий, вытащите их из этого репозитория в локальный репозиторий.
    • Если вы хотите, вы можете преобразовать ветки штампа обратно в штампы, скопировав "[WIP]" фиксацию с помощью git reset HEAD^ и снова сохраните рабочий каталог с помощью git stash save <custom-message>.

Если вы запустите git fsck, вы не увидите ошибок:

$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (197135/197135), done.
Checking connectivity: 197162, done.
$

И git stash list, git branch и git remote -v должны показывать тот же результат, что и раньше.

Ответ 5

Если у вас нет неуправляемых изменений, самым простым решением является удаление локальной ветки: git branch -D [название ветки]

а затем снова проверьте удалённую ветку: git проверка -b [название ветки] происхождение/[название отрасли]

Ответ 6

я исправил ошибку, внося изменения в ту же директорию/папку проекта, а затем попытался зафиксировать новое изменение, что случилось, так это я получил сообщение об ошибке msg 'недопустимый объект 100644 e38e910ceb18b09f436f353c3a131bfe2caba130 для' Book/alise_mathe/app/src/main/res/menu/drawermenu.xml" этот msg решил проблему, я просто реорганизовал drawermenu.xml, изменив имя файла на 'drawer_menu.xml'. добавлены изменения, сделанные нажатыми, и все. (Андроид-студия)

Надеюсь, это поможет некоторым образом

Ответ 7

Я исправил эту ошибку, удалив папку "repo" Capistrano из каталога удаленного сервера. Я рассмотрел ряд других предложенных проблем и решил, что проблема не связана с моим местным проектом. Проблема возникла, когда Капистрано выполнял вытягивание с репо на удаленный. Для меня это, возможно, было связано с остановленным развертыванием, которое оставило поврежденные объекты/ссылки на объекты. Мой хост также только что выполнил миграцию сервера, возможно, что-то стало повреждено во время этого процесса.