Как я могу работать с поврежденными объектными файлами git?

Я сделал притяжение git, когда я был ближе к моей квоте, и в результате (так я думаю) получил поврежденный файл:

$ git pull
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git fsck --full
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file

Как я могу решить эту проблему?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp был равен нулю; удаление этого не помогло решить мою проблему (те же ошибки).

Ответ 1

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

Временной файл объекта с нулевым размером, очевидно, может быть просто удален. Это не принесет нам никакой пользы. Коррумпированный объект, который ссылается на него, d4a0e75..., является нашей реальной проблемой. Его можно найти в .git/objects/d4/a0e75.... Как я сказал выше, это будет безопасно удалять, но на всякий случай, сначала сделайте резервную копию.

В этот момент новый git pull должен преуспеть.

... предполагая, что это будет успешным в первую очередь. В этом случае кажется, что некоторые локальные модификации препятствовали попытке слияния, поэтому были stash, pull, stash pop. Это может произойти с любым слиянием, хотя и не имело никакого отношения к поврежденному объекту. (Если не было необходимости в какой-либо очистке индекса, и этот приток сделал это в процессе... но я не верю в это.)

Ответ 2

вы можете использовать "find" для удаления всех файлов в папке /objects с размером 0 с помощью команды find .git/objects/ -size 0 -delete. Рекомендуется резервное копирование.