2014-05-18 10 views
44

Ho subito un'interruzione di corrente ieri sera durante la scrittura di un messaggio di commit. Quando ho avviato il backup della macchina non ho potuto completare il commit. Ho corso git reset, aggiunti nuovamente i file modificati, e ho cercato di nuovo, e ottenuto questo:Git repository corrotto (controllo dell'intestazione errato, oggetto allentato è danneggiato)

% git commit 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header 
fatal: a94406345ac44982b00cf57b4b9660a35436637f is not a valid object 

git fsck rivela quanto segue:

% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack 4346883490a0990e68db0187241abc1642765a73 header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object 4346883490a0990e68db0187241abc1642765a73 (stored in .git/objects/43/46883490a0990e68db0187241abc1642765a73) is corrupt 

ho notato i messaggi si lamentano diversi oggetti.

Ho cercato SO e il Web e ho provato alcune cose diverse ma senza successo.

  • Non ho una copia di backup recente.
  • La clonazione del repository in un'altra directory non aiuta; il nuovo repository mostra gli stessi identici problemi.
  • git stash dà lo stesso messaggio di git commit. Tutti gli altri comandi git sembrano funzionare normalmente.

Come posso sapere cosa c'è che non va e risolverlo?

Edit:git log uscita come suggerito (solo le prime righe):

% git log --oneline --decorate --all |head -n 8 
253b086 (HEAD, new_tokenize) Normalized tokenizer interface slightly 
0f2425a (master) Added procs to eval layer 
a4d4c22 Added procedures as a type 
d1e15ad (tag: v0.10) Added `if' form with tail call semantics 
f94a992 (tag: v0.9) Completed environments 
031116e Fixed bug where # on a line by itself caused segfault 
3d8b09f Added environments, define and set! 
01cc624 Put symbol table implementation into types.c 

Questo è un piccolo progetto personale; Di solito lavoro solo in (master) ma stavo facendo un esperimento al momento (new_tokenize). 253b086 è stato l'ultimo commit eseguito correttamente prima dell'interruzione dell'alimentazione.

+0

forse prova un 'git log' o' git log --oneline --decorate --all' per vedere come appare la cronologia – jkyako

+0

Fine. Non sei sicuro di cosa stai cercando esattamente, fammi sapere se vuoi la piena uscita o cosa. Non stavo facendo niente di strano – trentcl

+0

Principalmente solo cercando di capire cosa alla fine è perso/inaccessibile, dati gli oggetti corrotti segnalati. Supponendo che tu abbia qualche modifica locale non salvata salvata da qualche altra parte, puoi 'git checkout' ognuno degli id ​​elencati nel log? Mi chiedo se una soluzione di forza bruta sarebbe quella di scrivere su ciascuno degli id, verificare l'id, copiare l'albero di lavoro altrove (possibilmente un nuovo repository git) per provare e ricostruire un repository non corrotto. – jkyako

risposta

50

Sembra che git abbia creato i file in .git/objects per il nuovo commit, ma non ha scritto con successo su di essi. Ho risolto il problema eliminandoli uno alla volta e ripetendo git fsck --full per trovare quello successivo. Ho iniziato con quella originalmente riportata da git fsck:

% rm -f .git/objects/43/46883490a0990e68db0187241abc1642765a73 
% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack 86e7247af5865e857a3b61eed99986e2d9538df1 header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object 86e7247af5865e857a3b61eed99986e2d9538df1 (stored in .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1) is corrupt 
% rm -f .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1 
% git fsck --full 
Checking object directories: 100% (256/256), done. 
error: inflate: data stream error (incorrect header check) 
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header 
error: inflate: data stream error (incorrect header check) 
fatal: loose object a94406345ac44982b00cf57b4b9660a35436637f (stored in .git/objects/a9/4406345ac44982b00cf57b4b9660a35436637f) is corrupt 

E così via. Ho eliminato cinque oggetti prima che lo git fsck si rivelasse pulito, corrispondente (come suppongo) ai cinque file nel commit che stavo cercando di fare. Suppongo che la cronologia dei file non sia stata affatto danneggiata.

Per inciso, ho pensato a un altro metodo che sembra funzionare altrettanto bene. git clone copia gli oggetti non validi, ma non lo è git push. Dopo aver eseguito il backup, ho creato un nuovo repository vuoto (--bare, perché altrimenti non è possibile eseguire il push al master), quindi non ho modificato le mie modifiche e ho inserito entrambe le diramazioni nel nuovo repository. Quindi si trattava solo di controllarlo di nuovo e ripristinare le ultime modifiche dai miei backup.

Ancora interessato se qualcuno si preoccupa di fare luce sul meccanismo di guasto qui.

+0

Grazie mille. Hai salvato il mio giorno ... –

8

Risposta semplice a questa domanda per chiunque si trovi ad affrontare questo problema: il comando clone git è la correzione, se si dispone di un repository remoto, quindi clonarlo nella cartella locale (dopo aver eliminato il repository locale danneggiato), nel caso non si disponga di repo quindi provare a spingere il repo corrotto Github e poi clonarlo da lì, credo che gli oggetti danneggiati wont essere spinto e sarà risolvere il problema

+2

Potrebbe "risolvere" il problema, ma perderai i file danneggiati. –

2

Come descritto nel this answer mi sono imbattuto:

git reflog expire --expire-unreachable=now --all 
git gc --prune=now 

Quale rimosso tutti i miei blob penzolanti e i commit pendenti, così come gli oggetti db corrotti.

E 'stato molto più veloce del rintracciarli uno a uno!

+0

git gc --prune = ora mi dà lo stesso errore re: intestazione errata – IcedDante

+0

wow, questo ha funzionato per me. – RoLYroLLs

Problemi correlati