FWIW, вот ответ, который более практичен, чем многие из безнадежно оптимистичных ответов на другие вопросы о поврежденных git
репозиториях - большинство из которых делают безосновательное предположение, что плохой ОП может «просто клонировать» с удаленного происхождение! Хм. Но. Подождите секунду. Что если Я - источник ?
Ужас
История начинается, когда попытка запустить простое git gc --aggressive
показало, что в какой-то момент мое безоговорочное репо каким-то образом полностью скрывалось от моего - полностью локального - git
хранилища: оно не могло регистрировать что-либо, кроме нескольких месяцев назад, тем самым потеряв большую часть своей истории, и гортанно кричал всякий раз, когда его просили git fsck --full | grep -v dangling
. Несколько объектов были идентифицированы как потерянные git fsck
.
git-repair
: сокращение ужасающего ручного труда с 2014 года
После паники и нахождения множества вопросов с плохими ответами с чрезмерным количеством голосов, просто сказал: «Просто переклонируйте из удаленного источника!» - который, позвольте мне изложить точку зрения, у меня нет, потому что Я - источник - Я нашел git-repair
, сделал простое sudo aptitude install git-repair
и пусть он сделает все утомительные автоматические исправления, которые, вероятно, заняли бы у меня часы (пожалуйста: запустите копию вашего поврежденного репо [duh], без --force
!)
Это помогло уменьшить количество ужасов, о которых сообщалось git fsck --full | grep -v dangling
. Но вещи после середины августа все еще были недоступны.
В частности, все это, казалось, концентрировалось вокруг одного коммита, который не мог быть найден. Как я мог восстановить это? Поиск переполнения стека не сильно помог!
У вас есть резервная копия, верно?
Вот где мне посчастливилось получить резервную копию с конца ноября. Вы делаете резервные копии, верно? В моем случае это был ручной архив репозитория (моя ежедневная процедура резервного копирования - это какая-то ужасная инкрементная tar
вещь, которую я никогда не проверял ... а-кашель) ... но уф, это было достаточно хорошо. Она не пострадала от какого-либо унижения, от которого пострадали мои репо.
Но отсутствующий объект, похоже, не был просто сохранен в этой резервной копии .git/objects/XY/RESTOFHASHBLAHBLAHBLAH
. Это, вероятно, потому что это был коммит, а не файл. Я не знаю! git
для меня волшебство, навсегда за пределами моей способности постичь. Мне просто нужно исправить, быстро. Разве не поэтому мы все здесь?
Восстановление объектов из резервной копии (которая у вас есть, верно?)
Теперь, когда у вас есть резервное копирование, у меня возникла смешная глупая идея, он сказал: «Это никак не сработает!» И сразу обнаружил, что просто наивно запускает файл cp -fr /path/to/repo_backup/.git/objects/* /path/to/repo_git-repaired/.git/objects
в слияние каталога .git/objects
резервная копия в ее поврежденном, частично восстановленном репо ... работала, чтобы восстановить всю историю - обратно в доброе старое initial commit lol
. Проверка исправления: git fsck --full
теперь тоже был счастлив (несмотря на все свисающие биты).
Затем я взял резервные копии живых / поврежденных, частично отремонтированных и, казалось бы, восстановленных репозиториев на отдельный диск, на случай, если мне понадобится какой-либо из них снова.
Вы должны перепроверить эту методологию и команду перед тем, как запускать ее, или, возможно, найти гораздо лучший способ, о котором мне лень думать. Я не знаю. Но для меня это спасло мое репо. А по поводу того, что я угадаю, что я говорю ...
Бесконечные отказы от ответственности в бесконечных комбинациях
Теперь, очевидно, все это идет с предостережениями: вы должны попробовать все на копии вашего поврежденного репо, прочитать всю документацию, подумайте о том, чтобы быть немного более осторожным, чем я (это заставило * 1068) * команда), и не налагайте на меня ответственность или ответственность за абсолютно все, что идет не так * ... но это дает вам что-то лучше, чем «просто клонировать из удаленного источника!», верно?
*
Если, однако, все идет правильно , может потребоваться большое пожертвование. ;)
Если я кому-нибудь понадоблюсь, я буду подозрительно глядеть в общем направлении моего диска, надеюсь, придумать процедуру резервного копирования, для восстановления которой не потребуется двузначных часов (если вообще потребуется), и, возможно, даже немного поспать.