Какая-то добрая душа написала скрипт для этого автоматически (и более тщательно), но процесс восстановления в основном таков:
Изучите файл, сообщающий об мусоре, с помощью hexdump.
$ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Вы ищете часть файла, где есть огромный диапазон нулей. Если таких интервалов несколько, мне повезло (N = 2) при рассмотрении только первого гигантского набора нулей, даже если они включали небольшие серии ненулевых данных. Это "мусор", на который жалуется git.
...
0000500 0532 0302 0000 0000 0000 0000 0000 0000 # <-- Beginning here...
0000510 0000 0000 0000 0000 0000 0000 0000 0000
*
0001000 # ... almost 3kb of zeros.
Из этого вы можете определить реальный размер объекта. Здесь это будет 0x504 или 1284 байта.
Сделайте резервную копию объекта. Если вы выбрали неправильный набор нулей, вы можете повторить попытку с другим набором.
$ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Обрежьте файл до нужной длины.
$ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Поврежденный объект теперь должен быть исправлен. Предполагая, что это было единственное, клонирование / выталкивание / извлечение репозитория теперь должно работать как ожидалось.
Ссылаясь на мои источники, я думаю, что столкнулся с той же проблемой, но в моем случае я использовал Ubuntu 10.4 (ядро 2.6.32-23-generic). В данном случае это ошибка файловой системы, которая еще не была обнаружена. Существует открытая проблема на ecryptfs на эту тему, а также связанный поток usenet. На пути к решению я нашел удобный ответ и резюме по StackOverflow. Связанная статья была очень интересной, хотя в итоге я пошел другим путем.