Что я могу сделать с повреждением Git из-за отсутствия объекта? - PullRequest
11 голосов
/ 08 февраля 2011

Я просто пошел клонировать репозиторий на другом удаленном сервере и столкнулся с проблемой, пытаясь это сделать:

git clone git@codebasehq.com:blah/blah/docs.git
Cloning into docs...
remote: Counting objects: 343, done.
remote: error: unable to find 14f87a739828e4d489b0310a51e057b30333926e
remote: Compressing objects: 100% (325/325), done.
error: git upload-pack: git-pack-objects died with error.   
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: fatal: unable to read 14f87a739828e4d489b0310a51e057b30333926e
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

Я провел небольшое исследование и узнал о git fsck, вот результат:

$ git fsck --full
error: sha1 mismatch 14f87a739828e4d489b0310a51e057b30333926e

error: 14f87a739828e4d489b0310a51e057b30333926e: object corrupt or missing
missing blob 14f87a739828e4d489b0310a51e057b30333926e

У всех других людей с похожими проблемами проблема с неработающей ссылкой или что-то в этом роде. Я все еще новичок в Git, кто-нибудь знает, как это исправить?

Я все еще могу отправить в свой центральный удаленный репозиторий, но не могу его клонировать.

14f87a739828e4d489b0310a51e057b30333926e - это большой двоичный объект, который является файлом уценки в корне хранилища. Я попытался удалить этот файл и выдвинул эти изменения безрезультатно.


Редактировать: Можно ли импортировать историю мерзавцев из другого репо? Я думаю, что я мог бы просто запустить новый репо и скопировать в него свои файлы, а затем импортировать историю коммитов.

Ответы [ 3 ]

3 голосов
/ 08 февраля 2011

Вот почти тот же вопрос с очень подробным решением: Github Repo Corruption - Sha1 Collision

3 голосов
/ 08 февраля 2011

Если это всего один файл и он еще не упакован, вы сможете найти его в .git/objects/14/f87a739828e4d489b0310a51e057b30333926e в вашем локальном хранилище. Вы можете скопировать эти файлы в соответствующий каталог в хранилище на вашем сервере.

Если он упакован, вы сможете распаковать его, используя git unpack-objects в одном из файлов пакета в .git/objects/pack/. После этого копирование на сервер работает, как описано выше.

1 голос
/ 08 февраля 2011

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

У вас есть другой репозиторий с проектом, который не сообщает о каких-либо проблемах с fsck (и имеет рассматриваемый файл)? Например. на вашей локальной машине? Чем вы должны попробовать:

  1. Отложите поврежденный репозиторий в сторону.
  2. Клонируйте хороший репозиторий на его место.
  3. Переместите любые ветки, которые были у старого хранилища, в других хранилищах или в старом хранилище.

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

Примечание. Хотя на всех дисках есть хотя бы несколько контрольных сумм, большинство микросхем памяти вообще их не имеют, поэтому ошибка памяти, скорее всего, останется незамеченной, чем ошибка диска. memtest86 + - хороший способ проверить память.

...