Właśnie tego doświadczyłem - moja maszyna uległa awarii podczas pisania do repozytorium Git i uległa uszkodzeniu. Naprawiłem to w następujący sposób.
Zacząłem od sprawdzenia, ile zatwierdzeń nie wypchnąłem do zdalnego repozytorium, a zatem:
gitk &
Jeśli nie korzystasz z tego narzędzia, jest ono bardzo przydatne - dostępne, o ile wiem, we wszystkich systemach operacyjnych. Oznaczało to, że mój pilot nie miał dwóch zatwierdzeń. Dlatego kliknąłem etykietę wskazującą ostatnie zdalne zatwierdzenie (zwykle tak będzie/remotes/origin/master
), aby uzyskać skrót (skrót ma 40 znaków, ale dla zwięzłości używam tutaj 10 - i tak zazwyczaj działa).
Oto on:
14c0fcc9b3
Następnie klikam następujące zatwierdzenie (tj. Pierwsze, którego nie ma pilot) i tam mam skrót:
04d44c3298
Następnie używam obu z nich, aby zrobić łatkę dla tego zatwierdzenia:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Następnie zrobiłem podobnie z innym brakującym zatwierdzeniem, tj. Użyłem skrótu wcześniejszego zatwierdzenia i skrótu samego zatwierdzenia:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Następnie przeniosłem się do nowego katalogu, sklonowałem repozytorium ze zdalnego:
git clone git@github.com:username/repo.git
Następnie przeniosłem pliki łatek do nowego folderu, zastosowałem je i zatwierdziłem ich dokładnymi komunikatami zatwierdzenia (można je wkleić z okna git log
lub w gitk
oknie):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
To przywróciło mi rzeczy (i zauważ, że istnieje prawdopodobnie szybszy sposób na zrobienie tego dla dużej liczby zatwierdzeń). Chciałem jednak sprawdzić, czy drzewo w uszkodzonym repozytorium można naprawić, a odpowiedź brzmi: tak. Przy naprawionym repozytorium dostępnym jak wyżej, uruchom to polecenie w uszkodzonym folderze:
git fsck
Otrzymasz coś takiego:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Aby wykonać naprawę, zrobiłbym to w uszkodzonym folderze:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
tzn. usuń uszkodzony plik i zastąp go dobrym. Być może będziesz musiał to zrobić kilka razy. Wreszcie będzie punkt, w którym będziesz mógł biegaćfsck
bez błędów. Prawdopodobnie będziesz mieć w raporcie wiersze „zwisające zatwierdzenie” i „zwisające kropelki”, są one konsekwencją twoich zmian i poprawek w tym folderze i są OK. Śmieciarka usunie je w odpowiednim czasie.
Zatem (przynajmniej w moim przypadku) zepsute drzewo nie oznacza, że niepoprawne zatwierdzenia zostały utracone.