Как я могу восстановить git-репозиторий с отсутствующим объектом? - PullRequest
12 голосов
/ 02 декабря 2011

Мой репозиторий разработки в какой-то момент потерял объект.

$ git fsck
fatal: failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8: Invalid argument
$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
error: unable to find 2dddc84156fa30e4614a7ea5a1895885011b8db8
fatal: git cat-file 2dddc84156fa30e4614a7ea5a1895885011b8db8: bad file

У этого объекта только что клонированный репозиторий.

$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
tree

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

Как я могу залатать этот объект в мой сломанный репозиторий?

Ответы [ 3 ]

8 голосов
/ 02 декабря 2011

Что вы можете попробовать, так это получить файл .git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8 из только что клонированного репозитория и скопировать его в репозиторий для разработки ...

4 голосов
/ 02 декабря 2011

Это в значительной степени сводится к следующему: у вас есть резервная копия этого файла (.git / objects / 2d / ddc84156fa30e4614a7ea5a1895885011b8db8) где-нибудь?Если вы можете найти его, скопируйте его обратно в ваш репозиторий git, и все снова будет хорошо.Другими словами, знаете ли вы, что хранилище было клонировано?Если это так, вы найдете этот файл в папке git клона и скопируйте его в свой.Если вы не клонировали репозиторий, вы его где-нибудь заархивировали?Если вы на Mac, вы проверили машину времени?Если вы не используете Mac, используете ли вы что-то для резервного копирования своего кода?

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

Обычно это хорошая практикавсегда клонировать ваши репозитории в другое место, для безопасного хранения на случай, если что-то подобное произойдет.Именно поэтому такие сервисы, как github и bitbucket, так популярны.

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

3 голосов
/ 07 марта 2015

У меня недавно была куча отсутствующих объектов в локальном репозитории и нетленное хранилище ссылок для восстановления. Вот волшебство, которое я придумал, которое сработало для меня:

cd <path-to-local-repo>
git unpack-objects < <reference-repo-path>/objects/pack/pack-<hash>.pack

Оказывается, что все нужные мне объекты были в пакете в репозитории ссылок, а не в отдельных "свободных" объектных файлах. Это простое заклинание распаковывает этот файл в локальную базу данных, заполняя дыры. После выполнения

git gc

для очистки любых висячих коммитов (т. Е. Из-за перебазирования, изменения коммитов и т. Д.) Мой git fsck теперь чист.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...