2011-11-25 16 views
32

Il mio repository git è stato danneggiato dopo un paio di riavvii dovuti a problemi di alimentazione e ora non riesco a risolverlo (ero nel mezzo di mettere in scena alcuni file all'ultimo guasto)Riparare git repository danneggiato

$ git status                               
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git fsck 
fatal: failed to read object 24377c609184c192f3f3c1733bac7115c1080758: Invalid argument 
$ git branch -a 
(...works, lists branches...) 
$ git checkout someotherbranch 
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log            
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log someotherbranch 
(...works, shows commits...) 

Quindi, come potete vedere, il mio attuale ramo è piuttosto incasinato e non riesco a ripararlo. Qualche idea, cosa posso provare a riparare?

+1

è questo server repo? esistono cloni/reposli locali che è possibile utilizzare per il ripristino? – prusswan

+1

È il mio repository git locale ... Ho un clone su un'altra macchina che potrei usare per ripristinare tutto (con qualche commit perso forse), ma preferirei risolvere questo repository se possibile ... – Unknown

+0

Vale la pena ricordare che il contenuto della cartella di lavoro potrebbe essere ancora recuperabile. Do 'git diff> diff.patch', quindi potresti usarlo in questo modo per correggere un nuovo clone:' git patch -p1 datashaman

risposta

5

Provare a fare un backup del repository e quindi eseguire git reset --hard [email protected]{1} per tornare al precedente HEAD e vedere se funziona. Potrebbe essere solo l'attuale HEAD che è corrotto.

(È inoltre necessario eseguire fsck sul disco, se non l'hai già.)

+1

$ git reset --hard HEAD @ {1} Verifica dei file: 100% (5724/5724), terminato. fatale: impossibile leggere l'oggetto 3d18855708b0f127d40c13c679559d7679228b69: Argomento non valido – Unknown

+0

Darn. 'Git reflog' funziona? –

+1

No, stessa cosa :($ git reflog fatale: non è riuscito a leggere oggetto 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument – Unknown

31

La mia soluzione per una situazione simile è stato quello di sostituire un hash dell'oggetto danneggiato in .git/refs/heads/my-working-branch con un hash di commit precedente (che può essere trovato in .git/logs/HEAD).

+1

Ancora lascia il repository in uno stato non funzionante, ma ciò consente di ripristinarlo. – ony

+5

Non sono sicuro di capire cosa sia questo –

+0

wow. questo funziona ... il mio 'HEAD' è stato danneggiato in'^@^@^@^@ ... 'o qualcosa del genere. –

9

Per me, ho attivato TRIM in OSX con un SSD non Apple (che non è consigliato) e apparentemente ha causato varie corruzioni sul mio disco di avvio. Quindi il commit corrotto era profondo nella storia.

Non mi interessa troppo riparare il mio repository, eccetto che ho alcune filiali locali che erano troppo sperimentali per disturbare a spingere al repository remoto, e mi piacerebbe salvare il lavoro in quei rami.

In teoria, poiché si tratta di un repo locale, ritengo che GIT dovrebbe essere in grado di ripristinare/riparare se stesso utilizzando l'origine. Perché non è possibile?

Comunque mi imbattuti this cool strategy to push a branch to another local git repo. Sfortunatamente, clonazione repository in ../repo_copy e quindi usando come un telecomando locale provocato il seguente errore:

! git push --force local_remote HEAD 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 
error: failed to push some refs to '/Users/steve/Dev/repo_copy' 

Così ho iniziato invece con un repo vuoto, quindi spingendo i rami funzionavano bene. Quindi per qualsiasi filiale locale ho avuto il cui git log non è finita in:

.... 
    Fixing cukes 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 

ho semplicemente fatto il check-out e poi fare git push --force local_remote HEAD. L'ultima cosa che ho fatto è stata:

! cd ~/Dev/repo_copy 
! git remote add origin [email protected]:sdhull/my_repo.git # real remote 

Poi sono andato a git config -e e installare il mio ramo principale ed era di nuovo attivo e funzionante con niente perso! Fatemi sapere nei commenti se volete ulteriori dettagli su questo approccio. Saluti!

14

Mi è appena successo. Recludo il repository in una nuova cartella e sposta manualmente le ultime modifiche. Low tech ma funziona sempre. Spero che tu possa ricordare le tue ultime modifiche.

+4

Puoi semplicemente sostituire la cartella '.git' nel repository rotto con quella che hai reclonato. In questo modo non è necessario spostare le modifiche manualmente. Basta essere consapevoli della ramificazione. Potrebbe essere necessario conservare e controllare il ramo corretto. –

3

sono stato in grado di recuperare il mio repo da:

zsh(broken)% git log master 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
fatal: loose object 7fcab8648a989d9bb3f5246e6be7220395493395 (stored in .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395) is corrupt 
zsh(broken)% cat .git/refs/heads/master 
7fcab8648a989d9bb3f5246e6be7220395493395 
e311726c4eb970f4d4f504ad86248d322855018f da9c14d03e4849394087b61ff6272399937f7cce Nikolay Orliuk <[email protected]> 1379583764 +0300 commit: plan: timings 

Azzerando master a prev commettere da9c14d03e4849394087b61ff6272399937f7cce come detto da @Nash Bridges:

zsh(broken)% echo da9c14d03e4849394087b61ff6272399937f7cce > .git/refs/heads/master 
zsh(broken)% git log --oneline -1 master 
da9c14d plan: timings 
zsh(broken)% git fsck 
Checking object directories: 100% (256/256), done. 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
fatal: loose object 0eace931fdc851da254e9522596d1517d0ed51c5 (stored in .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5) is corrupt 

Creazione di un nuovo repo vuota, il recupero master da broken

zsh(broken)% mkdir ../recover && cd ../recover && git init 
Initialized empty Git repository in /home/nikolay/talks/y/recover/.git/ 
zsh(recover)% git fetch ../broken master 
remote: Counting objects: 44, done. 
remote: Compressing objects: 100% (44/44), done. 
remote: Total 44 (delta 20), reused 0 (delta 0) 
Unpacking objects: 100% (44/44), done. 
From ../broken 
* branch   master  -> FETCH_HEAD 
zsh(recover)% git reset --hard FETCH_HEAD 
HEAD is now at da9c14d plan: timings 
zsh% git fsck 
Checking object directories: 100% (256/256), done. 

Per ripristinare questo e le modifiche che era sulla strada per master:

zsh(recover)% rm -rf * && cp -a ../broken/* ./   
zsh(recover)% git add -u && git commit -m 'prepare for publishing' 
1

Ho seguito le istruzioni trovate here

$ cd /tmp/ 
$ git clone good-host:/path/to/good-repo 
$ cd /home/user/broken-repo 
$ echo /tmp/good-repo/.git/objects/ > .git/objects/info/alternates 
$ git repack -a -d 
$ rm -rf /tmp/good-repo 

Ha lavorato per me

1

Il più semplice soluzione per me: Si potrebbe git clone in un nuova cartella, quindi sostituire clean new_folder/.git nella vecchia cartella (la cartella spezzata). Funziona bene per me!

git clone ...(remote) new_folder 
mv old_folder/.git old_folder/.git_old 
cp -R new_folder/.git old_folder/ 

Cheers!

1

Un'altra alternativa, che ha lavorato per me è stato quello di ripristinare la testa git e l'indice al suo stato precedente utilizzando:

git reset --keep

Ho provato anche i seguenti comandi, ma non ha funzionato per me, ma potrebbero per voi:

git reset --mixed git fsck --full git gc --auto git prune --expire now git reflog --all

Problemi correlati