Получение ошибки при запуске `git push` - PullRequest
1 голос
/ 14 июня 2011

Я попытался запустить git push и получил ошибку повреждения:

% git push
Counting objects: 62, done.
Delta compression using up to 2 threads.
error: corrupt loose object 'f2310668fe335b36c513e50fcd99744e8fd5c2e0'
fatal: object f2310668fe335b36c513e50fcd99744e8fd5c2e0 is corrupted
error: pack-objects died with strange error

Это висит на последней строке, пока я не нажму Ctrl+C.

Я прочитал, что запуск git gc может помочь, поэтому я сделал это и получил похожую ошибку:

% git gc
Counting objects: 493, done.
Delta compression using up to 2 threads.
error: corrupt loose object 'f2310668fe335b36c513e50fcd99744e8fd5c2e0'
fatal: object f2310668fe335b36c513e50fcd99744e8fd5c2e0 is corrupted
error: failed to run repack

Что мне сделать, чтобы это исправить?

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Клонируйте резервную копию вашего хранилища.Если идентификатором поврежденного объекта является $ OBJECTID, выполните следующие действия:

В новом хранилище:

git cat-file -t $OBJECTID > object-type
git cat-file $(cat object-type) $OBJECTID > object-contents

Переместите эти два новых файла в старое хранилище

В поврежденном хранилище,уберите ваш поврежденный объект:

mv .git/objects/XX/XXXXXXXXXXXXXXXXXX .
git hash-object -t $(cat object-type) -w object-contents

Это должно записать объект в базу данных git и вывести $ OBJECTID в STDOUT.Если он выводит какой-то другой идентификатор SHA1, вы допустили ошибку и вам следует удалить этот неправильный объект.

1 голос
/ 15 июня 2011

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

git fetch

, а затем отмените изменения в верхней части ветки удаленного отслеживания.Если вы находитесь в ситуации ускоренной перемотки, это ничего не должно делать

git rebase origin/yourbranch

, если это не ff-ситуация, вы должны получить ошибку при коммите, который либо сам по себе поврежден, либо указывает наструктура дерева и BLOB-объектов, на которую она указывает.

Если это была ситуация типа ff, выполните

git rebase -i origin/yourbranch

, ничего не меняя.Сохранить и выйти, а git перепишет коммиты поверх того, где они находятся.Это не должно завершиться без коммита, который поможет вам отследить плохой объект.

надеюсь, это поможет

0 голосов
/ 14 июня 2011

Вы можете попытаться повторно клонировать репо из внешнего источника, а затем извлечь изменения из собственного измененного. Это работает, если дефектный объект не создан одним из ваших собственных коммитов.

git clone http://foo/bar
cd bar
git fetch ../orig [branch1:branch1 [branch2:branch2[...]]]

Вы также можете попытаться извлечь объект f2310668fe335b36c513e50fcd99744e8fd5c2e0 из свежего клона и поместить его в .git/objects/f2/310668fe335b36c513e50fcd99744e8fd5c2e0 и снова запустить git gc, но сделайте это с копией вашего репо.

...