L'ho appena sperimentato: la mia macchina si è arrestata in modo anomalo durante la scrittura nel repository Git e si è danneggiata. L'ho risolto come segue.
Ho iniziato osservando quanti commit non avevo spinto nel repository remoto, quindi:
gitk &
Se non si utilizza questo strumento, è molto utile, disponibile su tutti i sistemi operativi per quanto ne so. Ciò indicava che nel mio telecomando mancavano due commit. Ho quindi cliccato sull'etichetta indicando l'ultimo commit remoto (di solito questo sarà /remotes/origin/master
) per ottenere l'hash (l'hash è lungo 40 caratteri, ma per brevità sto usando 10 qui - di solito funziona comunque).
Ecco qui:
14c0fcc9b3
Quindi faccio clic sul seguente commit (ovvero il primo che il telecomando non ha) e ottengo l'hash lì:
04d44c3298
Quindi uso entrambi per creare una patch per questo commit:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Ho quindi fatto lo stesso con l'altro commit mancante, cioè ho usato l'hash del commit prima e l'hash del commit stesso:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Mi sono quindi spostato in una nuova directory, clonato il repository dal telecomando:
git clone git@github.com:username/repo.git
Ho quindi spostato i file patch nella nuova cartella, li ho applicati e li ho impegnati con i loro messaggi di commit esatti (questi possono essere incollati dalla git log
o dalla gitk
finestra):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Ciò ha ripristinato le cose per me (e nota che probabilmente c'è un modo più veloce per farlo per un gran numero di commit). Tuttavia, volevo vedere se l'albero nel repository corrotto può essere riparato e la risposta è che può. Con un repository riparato disponibile come sopra, esegui questo comando nella cartella danneggiata:
git fsck
Otterrai qualcosa del genere:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Per fare la riparazione, lo farei nella cartella rotta:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cioè rimuovere il file danneggiato e sostituirlo con uno buono. Potrebbe essere necessario farlo più volte. Finalmente ci sarà un punto in cui è possibile eseguire fsck
senza errori. Probabilmente avrai delle righe "commit in sospensione" e "blob in sospensione" nel rapporto, queste sono una conseguenza delle tue modifiche e modifiche in questa cartella e sono OK. Il garbage collector li rimuoverà a tempo debito.
Quindi (almeno nel mio caso) un albero corrotto non significa che i commit non compressi vengano persi.