Поправка на счупено GIT репо

Публикувано на

В рамките на една седмица ми се счупи два пъти да се рестартира машината на която работя (всъщност две машини една реална и една виртуална). И двата локалното GIT репо на проекта по който работех се счупи. Даваше грешка от рода:

error: object file .git/objects/bf/ad64aa6d1f4fd5920a7213654fdd35268ec25b is empty fatal: loose object bfad64aa6d1f4fd5920a7213654fdd35268ec25b (stored in .git/objects/bf/ad64aa6d1f4fd5920a7213654fdd35268ec25b) is corrupt

Когато ми се случи за първи път, не бях правил много неща (или поне така си мисля) и клинирах репото наново и си продължих работата. Когато обаче се случи за втори път имах известно количество работа която не исках да загубя (пък и исках да разбера какво се случва и дали може да се предодврати следващият път). Порових се из интернет и попаднах на следните постове в StackOverflow:

http://stackoverflow.com/questions/2909225/git-log-fatal-object-sha1-is-corrupted

http://stackoverflow.com/questions/7378738/cant-fix-bad-object-head-error-with-git-status

Пробвах разни неща но все не се получаваше. Като цяло ситуацията е доста индивидуална, но проблема се получава от това че някой от обектите е празен. Понеже файла е празен т.е. няма информация в него GIT не знае какво да прави.

Преди да започнем да правим каквото и да е е добре да се направи бекъп на цялата директория, за да може ако нещо не проработи да пробваме отначало!

В една от статиите пишеше да се изтрие повреденият (празен файл). И без друго няма информация в него значи нищо не можем да извлечем от него каквото ида е и за това може да бъде изтрит. След това давам git status и в моя случай ми хвърли грешка:

fatal: bad object HEAD

Това означаява, че повреденият обект е бил текущият HEAD и GIT не знае кой е последния комит и от къде да започне да генерира дървото. Указател към текущият HEAD се пази в:

.git/refs/heads/<името на бранча>

Може да бъде сменен ръчно до някой друг комит (например предишният). За да видим хеша на предишният комит можем да отворим:

.git/logs/HEAD

В този файл се пази информация за това кога кой коит е бил HEAD. На предпослдния ред е желаният от нас комит. Хешът му е във втората колона. Копираме го и го поставяме във refs/heads/<повредения бранч> като изцяло препокриваме файла.

След това може да се пусне

git fsck --full

за да се провери дали всичко е наред. За щастие при мен беше.

 

Най вероятно при всеки ситуацията ще бъде различна, но това не значи че не е поправимо. Важното е да се познават инструментите с които се работи и съответно е хубаво да си гасите компютъра от shut down!

blog comments powered by Disqus