Come gestire git gc fatal: bad object refs / remotes / origin / HEAD error?


131

L'ho colpito a caso oggi mentre cercavo di eseguire Git garbage collect :

$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

Come lo gestisco?

Risposte:


163

Non capisco le ramificazioni di questo, ma come suggerito in questo thread , quando l'ho riscontrato l'ho appena fatto

$ mv .git/refs/remotes/origin/HEAD /tmp

(tenendolo in giro per ogni evenienza) e poi

$ git gc

ha lavorato senza lamentarsi; Non ho riscontrato alcun problema.


6
Ha funzionato per me e penso di essermi imbattuto in questo problema perché ho cambiato il ramo predefinito da mastera un altro chiamato develop. Giorni prima ho cambiato di nuovo da developa mastere ho cancellato il vecchio ramo predefinitodevelop , ma nella mia directory di lavoro, il file .git/refs/remotes/origin/HEADpuntava ancora a refs/remotes/origin/developcui non esiste più. In questa situazione la rimozione del file ha funzionato.
Stavarengo

4
git pruneha funzionato per me, un modo per eliminare i dati accumulati in Git ma a cui non fa riferimento nulla di utile.
Sven Malvik

La loro esecuzione ha risolto il mio problema:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
David Rauca

2
Ho il sospetto che il modo migliore sarebbe @ risposta di WilQu ( stackoverflow.com/a/49944297/660339 ). Qualcuno può confermarlo?
Ivan Perez

rimuovendo quei file dalla cartella .git, che ha git gcfunzionato per me
Vino

68

Il problema che ho riscontrato (che è lo stesso problema menzionato da @Stavarengo in questo commento sopra) è che il ramo remoto predefinito ( developnel mio caso) era stato eliminato, ma era ancora referenziato .git/refs/remotes/origin/HEAD.

L'apertura .git/refs/remotes/origin/HEADnel mio editor ha mostrato questo:

ref: refs/remotes/origin/develop

L'ho modificato con cura in modo che punti al mio nuovo ramo predefinito e tutto è andato bene:

ref: refs/remotes/origin/master

L'indizio che mi ha fatto capire è che la corsa ha git prunemostrato questo errore:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD

1
Questa era anche la mia soluzione
Dan Carlstedt il

1
Questa era la mia soluzione esatta. Il nostro team è recentemente passato dall'utilizzo di uno sviluppo di branch predefinito al master
jmancherje

40

Dopo aver visto la risposta di Trenton, ho guardato la mia .git/refs/remotes/origin/HEADe ho visto che puntava anche a un vecchio ramo che ora è stato cancellato.

Ma invece di modificare il file da solo, ho provato la soluzione di Ryan:

git remote set-head origin --auto

Ha impostato automaticamente il file sul nuovo ramo e ha git gcfunzionato bene dopo.


Sì, questo funziona per me, dato che ero nello stesso identico scenario. git remote set-head $REMOTE --autonel mio caso, $ REMOTE è l'alias remoto, non l '"origine" predefinita, perché ho configurato più telecomandi.
Devy

29

Ho pensato che la soluzione fosse la seguente poiché sembrava funzionare, ma risulta che non risolve effettivamente il problema.

git remote set-head origin --auto

1
Sembra che questo comando mi abbia aiutato a sbarazzarmi dello stesso problema. Tuttavia, dopo questo comando, l'ho anche usato git prune(come consigliato nel primo output del comando), quindi non sono in grado di dire esattamente cosa mi ha aiutato: primo, secondo o entrambi.
Borys Pylhun

1
git remote set-head origin --autorisolto il mio file refs / telecomandi / origine / HEAD senza che io dovessi usaregit prune
refs dovessi danio

Ho riscontrato questo errore :, error: Multiple remote HEAD branches. Please choose one explicitlye ho dovuto usare git remote set-head origin mybranch(mentre il ramo "mybranch" era in fase di checkout) per far scomparire l'errore.
derekmx271

3
Downvoting perché non è una risposta completa e può essere fuorviante.
Christian Vielma

9

Sembra che i tuoi riferimenti simbolici potrebbero essere interrotti ... Prova a sostituirlo con il tuo ramo predefinito in questo modo: Ad esempio, il mio ramo predefinito è master

$ git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
$ git fetch --prune
$ git gc

Questo dovrebbe risolverlo.


0

Se stai usando git worktrees, assicurati di fare un file

git worktree prune

prima di correre

git gc

Ho avuto un albero di lavoro danneggiato e questo sembrava fare il trucco dopo aver rimosso l'albero di lavoro danneggiato. git prunedi per sé non sembra funzionare.


0

La causa di ciò per me stava lavorando in una cartella compressa in Windows. Quando la cartella è stata decompressa, ha danneggiato i file del pacchetto, causando altri strani problemi, come l'impossibilità di potare rami inesistenti.

L'unica soluzione era cancellare la directory di lavoro e clonare nuovamente i remoti del repository. Fortunatamente, potevo ancora eseguire il push e il pull degli aggiornamenti per assicurarmi che nulla andasse perso. Adesso va tutto bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.