2010-11-06 14 views
46

ho fatto un pull git quando ero vicino alla mia quota, e come risultato (così credo), ha un file danneggiato:Come si gestiscono i file oggetto git corrotti?

$ git pull 
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git fsck --full 
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3 
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3 
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file 

Come posso risolvere questa corruzione?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp era zero byte; eliminarlo non ha fatto nulla per risolvere il mio problema (stessi errori).

+0

Il contenuto deve sommare sha1 al nome file. Non c'è modo di ripristinare i contenuti in base all'hash, quindi a meno che git non abbia una sorta di ridondanza integrata per questa esatta situazione (non posso dire che non lo sia), direi che devi recuperare o clonare il contenuto di nuovo remoto. – meagar

+0

Hai detto che l'hai cancellato - hai provato a tirare di nuovo dopo? Un oggetto temporaneo di dimensione zero emette un trasferimento interrotto ... – Cascabel

+0

L'output di 'find. -name d4a0e7599494bfee2b5351113895b43c351496b3' è niente. Cancellare il file sha1 e tirare solo i risultati nel file sha1 vuoto generato. – Mike

risposta

31

In generale, riparare oggetti corrotti può essere piuttosto difficile. Tuttavia, in questo caso, siamo certi che il problema è un trasferimento interrotto, il che significa che l'oggetto si trova in un repository remoto, quindi dovremmo essere in grado di rimuovere la nostra copia in modo sicuro e lasciare che questa ottenga dal remoto, correttamente questa volta .

Il file oggetto temporaneo, con dimensioni zero, può ovviamente essere rimosso. Non ci farà del bene. L'oggetto corrotto che si riferisce ad esso, d4a0e75..., è il nostro vero problema. Può essere trovato in .git/objects/d4/a0e75.... Come ho detto sopra, sarà sicuro rimuoverlo, ma nel caso, prima esegui il backup.

A questo punto, un nuovo git pull dovrebbe riuscire.

... presumendo che avrebbe avuto successo in primo luogo. In questo caso, sembra che alcune modifiche locali abbiano impedito il tentativo di unione, quindi un stash, pull, stash pop era in ordine. Questo potrebbe accadere con qualsiasi unione, tuttavia, e non aveva nulla a che fare con l'oggetto danneggiato. (A meno che non ci sia stato un po 'di pulizia dell'indice necessario, e lo stash lo ha fatto nel processo ... ma non ci credo.)

+1

Questo potrebbe causare 'errore: ref/heads/branch non punta a un oggetto valido!'. Assicurati di eseguire il backup. –

5

Recovering from Repository Corruption è la risposta ufficiale.

la risposta veramente breve è: trovare oggetti non corretti e copiarli.

+2

Questo non è particolarmente utile. L'oggetto corrotto in questione non è quasi certamente uno che ha bisogno di essere ripristinato; è uno che è stato parzialmente recuperato da un telecomando. – Cascabel

+0

Questo è l'unico modo, è stato utile per me !!!! Grazie mille))) –

15

puoi usare "trova" per rimuovere tutti i file nella cartella/objects con dimensione 0 con il comando find .git/objects/ -size 0 -delete. Il backup è raccomandato.

+0

hmm, che mi ha aiutato, dopo la sospensione, ho un paio di oggetti vuoti e rimuoverli mi ha permesso di recuperare oggetti reali dal repository remoto. Fortunatamente ho spinto poco prima di sospendere. Eppure per vedere cosa succede con i file che non ho ancora commesso, si spera che siano stati sincronizzati su disco prima di sospenderli. ATTENZIONE, è meglio salvare gli hash che si eliminano se è necessaria un'ulteriore ispezione. – akostadinov

Problemi correlati