2011-08-29 25 views
23

Stiamo utilizzando Gerrit per il nostro repository Git. In un progetto che è attivo da diversi mesi, improvvisamente non siamo in grado di apportare modifiche. Quando eseguiamo git push vediamo il seguente errore:Come posso recuperare il mio repository Git per un errore "albero mancante"?

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

Esecuzione git fsck --full rendimenti:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a 
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27 
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff 
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2 
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f 
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df 
dangling tree 5377d7f7111d340854c3ee0946667c202227e603 
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1 
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819 
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94 
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d 

Tutti i nostri sviluppatori stanno vivendo lo stesso errore quando si cerca di spingere. Finora, abbiamo provato a reinizializzare il repo gerrit (git init --bare ...) e spingendoci sopra. Abbiamo anche provato a creare un nuovo progetto gerrit con un repository separato. Alla fine, continuiamo a ricevere lo stesso errore.

Qualcuno ha qualche idea su quale sarebbe la causa, o come recuperare?

risposta

7

Eseguire il backup ... eseguire il backup proprio questo secondo prima di provare qualsiasi cosa.

Ora, sembra un peccato. È anche un peccato che non sembri che tu abbia un backup regolare da visitare. Ci sono buone notizie, però: scommetto che i tuoi sviluppatori hanno questo file, anche se potrebbe trovarsi in un file pack. Prova quanto segue nella directory .git di qualcun altro. Nota che git usa i primi due caratteri dell'hash per il nome della directory.

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9 

Se questo si presenta, copiare il file nella stessa percorso relativo sul server, e la vita deve andare avanti bene. Se no, allora provate questo:

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9 

Questo non mostrerà quali pacco file, viene (si può rapidamente lo script questo o farlo manualmente), ma vi dirà che è là. Trovare il file pacchetto giusto ed espanderlo ...

git unpack-objects $FILE 

Da lì, copiare il file nella stessa percorso relativo sul server. Se ciò non risolve, è necessario un ulteriore lavoro. Scambiare il repository aggiornato di uno sviluppatore potrebbe risolvere il problema. Potresti anche voler esplorare https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F o postare commenti di aggiornamento e attendere che torni su questo punto.

+0

Grazie per le informazioni, mi ha aiutato un po '. Sono stato in grado di trovare il file idx giusto, ma decomprimere il file del pacchetto non ha ripristinato nulla. Era la stessa storia anche per alcuni dei nostri altri sviluppatori. Alla fine, ho esaurito il tempo, quindi abbiamo risolto il problema inizializzando un nuovo repository e mantenendo il vecchio in giro per la cronologia. –

+0

Abbiamo un problema simile in cui non siamo in grado di forzare determinati rami a causa di un errore dell'albero mancante. Abbiamo individuato l'oggetto mancante e lo abbiamo copiato nel repository remoto, ma il problema persiste. Qualche indizio? –

3

Prova a git pull --rebase.

Ho salvato il diff (git show > ~/mychanges.txt, ho eliminato il messaggio di commit nella parte superiore del file). Il check-out di una nuova filiale (git checkout -b newbranch) ha applicato le modifiche (git apply ~/mychanges.txt), quindi ha fatto un git pull --rebase. Quindi tutto ha funzionato.

+1

Grazie per aver salvato la giornata! – simonso

0

Tecnicamente questa risposta è un po 'in ritardo, ma quello che ha funzionato per me è stato creare una patch per il changeset che stavo cercando di spingere, riavviare il repository su un'altra posizione del disco, Applicare la patch, recommitted e pushed.

0

Soluzione rapida è Fetch -> Rebase-> Confermare e quindi premere.

3

Se non sul ramo principale, è possibile semplicemente eliminare il ramo remoto:

git push --delete origin <branch_name> 

E poi spingere il ramo di nuovo al telecomando:

git push -u origin <branch_name> 
11

sto ottenendo questo stesso errore su la mia git tortiuse. Alla fine ottengo la causa principale di questo errore.

I passaggi che causano questo errore;

  • Creare un nuovo ramo sulla testa.
  • fare alcune modifiche sulle nuove filiali
  • Qualcuno anche fare modifiche sul ramo di testa
  • cercare di spingere la vostra filiale

si verificherà questo errore se una filiale locale è creato e non ha spinto fino a qualche modifica ara fatto nel ramo della testa. Questa è una cosa normale, dal momento che il ramo di testa remoto non sa nulla del tuo ramo locale fino a quando non viene eseguita un'azione push.

Per risolvere questo errore, cambiare il ramo della testina per ottenere un'azione di trazione completa. Quindi cambia la tua filiale e prova una spinta.

+0

Wow è una causa completamente non ovvia. Questa soluzione ha funzionato per me! –

29

Utilizzare git push --no-thin anziché git push.

da Git docs:

A thin transfer significantly reduces the amount of sent data when the sender and receiver share many of the same objects in common. The default is --thin.

+3

Se il tuo ramo è avanti di molti commit, potresti voler usare questa opzione. Funziona bene! – Riverside

1

provare ad aggiornare la versione di git, abbiamo visto i problemi con 1.9.0

3

Quando riusciamo ad ottenere questo, posso quasi sempre risolvere il problema con un gc git:

git gc --aggressive --prune=now 

eseguire il backup del tuo repository git prima!

1

Ciò accade generalmente quando il tempo di commit e push è diverso e, in definitiva, crea una mancata corrispondenza tra entrambi gli alberi. Dato un ramo remoto monte e ramo locale foo

Innanzitutto buttare via tutte le modifiche non utilizzando

git reset --hard foo 

Poi tracciare il ramo remoto utilizzando

git branch --set-upstream-to=upstream/foo 

Infine

git pull 
Problemi correlati