2010-05-25 2 views
20

Есть ли способ восстановить мой репозиторий с историей фиксации в такт.Git log: фатальный объект [sha1] поврежден

# git log 
fatal: object 01aeb2bf2e93b238f0e0422816b3e55518321ae7 is corrupted 

Из-за того, что читаю приведенную ниже ссылку, мне кажется, что я ее заберу и начну.

http://www.miek.nl/s/7e76eadefe/

+1

Я должен добавить, что основной причиной этого было повреждение диска на моей виртуальной машине, которое не было закрыто правильно. – Keyo

ответ

11

У вас есть клоны этого хранилища в другом месте? Возможно, вы захотите прочитать this post Линусом Торвальдсом для восстановления этого поврежденного объекта, предполагая, что поврежденный объект является блобом (содержимым файла).

+0

Нет клонов. Я только что поставил это вчера. Так что у меня было всего 10 коммитов. Я закончил тем, что начал свежий. Но определенно вытащите его где-нибудь еще в конце каждого дня. Урок выучен. Все еще рады быть в стороне от svn. Гит быстро! – Keyo

+5

Было бы полезно включить суть сообщения в ваш ответ, просто поднять, скажем, kernal.org когда-либо взломано и находится в автономном режиме :( – SpoonMeiser

8

Я оказался в той же ситуации, возможно, из-за неправильного завершения работы виртуальной машины, в которой я работал. В объектах .git /, имеющих нулевую длину, было около 10 объектов. Насколько я могу судить, фактические файлы исходного кода были в порядке, только репозиторий был закрыт.

$ git status 
fatal: object fbcf234634ee04f8406cfd250ce5ab8012f92b08 is corrupted 

За несколько предложений, которые я видел в другом месте (в том числе поста Линуса, указанный выше), я попытался временно двигающимся порочный объекты мерзавец жаловался из .git/объектов в других местах. Когда он перешел все из них, я получил:

$ git status 
fatal: bad object HEAD 

Примерно через час Googling и пробовать различные решения, я сдался и начал новую рабочую копию с помощью «Git клон», чтобы вытащить из происхождения (который был около 2 часов позади моей рабочей копии). Затем я использовал rsync -rC (-C исключает файлы SCM), чтобы скопировать измененные файлы из перепутанной рабочей копии в новую рабочую копию.

+0

Спасибо, кажется, работает на меня. Предотвращение бедствий. – DevX

+0

То же самое и здесь. rsync работал отлично - ничего не потерял, просто журнал, который был легко воссоздан. Спасибо! –

1

Вы также можете попытаться восстановить эти объекты, просто скопировав их из других репозиториев.

Моя виртуальная машина разбилась во время записи нажатой фиксации, поэтому объекты были надежно сохранены на локальном компьютере. Я scp'ed их на виртуальную машину, и voila - git fsck не выдает ошибок.

1

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

fatal: object 985a4870e7d890b314d2794377045a8b007c7925 is corrupted 

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

project_directory/.git/objects/98/5a4870e7d890b314d2794377045a8b007c7925 

Где вы можете увидеть файл 0 байт и его удаление позволило извлечь, чтобы начать работать.

Предположительно предыдущая выборка была прервана, оставив поврежденный объект с размером = 0 байт.

+0

странно, что это действительно работает, вроде как пнуть телевизор, чтобы очистить статику! –

+1

Не работал для меня, и это звучит как плохо идея, рассматривающая несколько страничных инструкций Torvalds о том, как исправить поврежденный объект (перечисленные выше в ответе). –

+0

Не работает для меня. Моя цель негде найти –

1

была такая же проблема, какой бы ни команда GIT я выбежала, он закончился с сообщением:

fatal: object <hash> is corrupted 

у меня не было резервной копии и не хотите потерять свои коммиты, поэтому я решил попробуйте решение Джейс и удалили файл 0 длины я имел: .git/objects/00/<hash> Тогда получил тот же:

$ git status 
fatal: bad object HEAD 

Затем я попытался узнать, что был неправ, и смотрел в .git/refs/heads/master где я имел хэш.

Я посмотрел в .git/logs/refs/head/master и нашел линию, как это:

<old commit> <new commit> <author> <timestamp> commit: <commit message> 

я удалил последнюю строку (которая была =) и вставил эту линию в .git/refs/heads/master, стирая его содержание

Я был тогда способный успешно совершить.

1

У меня была эта проблема. Я заметил, что я не был зарегистрирован как root. Когда я вошел в систему под именем root, я смог проверить журнал без знака ошибки.

Чтобы закрепить это хорошее состояние, я сделал это:

git add . 
git commit -a -m "stabilize git" 

Я вышел из корня и попытался потянув от клиента. Это сработало для меня потом.

Когда я делал добавление и фиксацию, я знал, что все в порядке с тем, что было в каталоге. У меня не было изменений, видимых через «статус git».

Смежные вопросы