Как бороться с ошибкой Git «Не удалось прочитать» - PullRequest
43 голосов
/ 02 октября 2009

Я получаю эту ошибку в моем репозитории 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 не очень помогает, эта ошибка кажется очень редкой Я не уверен, как с этим бороться. Может ли это быть сбой жесткого диска?

Редактировать : Вывод git fsck следующий:

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

Ответы [ 7 ]

25 голосов
/ 02 октября 2009

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

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

Примечания:

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

git fsck --name-objects

Помогает присвоение имен происхождение этих неработающих ссылок

Подробнее см. " Как исправить битую ссылку на ошибку git из дерева в дерево? ".

17 голосов
/ 11 сентября 2013

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

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

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

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

4 голосов
/ 22 октября 2010

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

$ cd .git
$ chmod 755 *

Готово! * * 1004

2 голосов
/ 12 сентября 2014

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

  • Проверьте, какую информацию у вас есть в вашем Git-репозитории, которую вы не получите, просто перекодировав. Для меня это были частные филиалы, тайники и пульты.
    • Преобразуйте тайники в реальные коммиты, создав новую ветку, применив тайник и зафиксировав что-то вроде «[WIP]» в имени, чтобы показать, что это тайник.
    • Сохраняйте ветки, которые не находятся на общедоступном пульте, передавая их на свой пульт. Это может быть форк репозитория на GitHub или просто новый репозиторий Git в другом месте на вашем компьютере.
    • Если у вас более одного пульта, сохраните вывод git remote -v, который содержит имена и URL-адреса ваших пультов, чтобы вы могли вручную добавить их позже.
  • Удалите каталог вашего хранилища .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>.
    • Если вы создали резервные копии ветвей (или хранилищ, преобразованных в ветви) в удаленный репозиторий, перетащите их из этого репозитория в локальный репозиторий.
    • Если хотите, вы можете преобразовать ветки stash обратно в хранилища, выполнив коммит «[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 должны показывать тот же вывод, что и раньше.

0 голосов
/ 30 октября 2016

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

0 голосов
/ 16 июля 2016

Я исправил ошибку, внеся изменения в ту же директорию / папку проекта, а затем попытался зафиксировать новое изменение. В результате я получил сообщение об ошибке «Недопустимый объект 100644 e38e910ceb18b09f436f353c3a131bfe2caba130 для« Book / alise_mathe / app / src / main » /res/menu/drawermenu.xml» Это сообщение решило проблему, я просто реорганизовал в себе headermenu.xml, изменив имя файла на «pocket_menu.xml». добавил внесенные изменения нажал и все. (Андроид-студия)

Я надеюсь, что это поможет некоторым, как

0 голосов
/ 29 сентября 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...