¿Cómo manejar git gc fatal: referencias de objetos malos / controles remotos / origen / error HEAD?

131

Al azar golpeé esto hoy mientras trataba de ejecutar Git Garbage Collect :

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

¿Cómo trato con esto?

Ryan
fuente

Respuestas:

161

No entiendo las ramificaciones de esto, pero como se sugiere en este hilo , cuando me encontré con esto, simplemente lo hice

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

(manteniéndolo alrededor por si acaso) y luego

$ git gc

trabajó sin quejarse; No me he encontrado con ningún problema.

petrelharp
fuente
66
Funcionó para mí y creo que me metí en este problema porque cambié la rama predeterminada de masterotra llamada develop. Días antes de cambiarlo de nuevo developa mastery eliminé la antigua rama predeterminadadevelop , pero en mi directorio de trabajo, el archivo .git/refs/remotes/origin/HEADtodavía apuntaba a lo refs/remotes/origin/developque ya no existe. En esta situación, eliminar el archivo funcionó.
Stavarengo
44
git prunefuncionó para mí, una forma de eliminar datos que se han acumulado en Git pero que no están siendo referenciados por nada útil.
Sven Malvik
Ejecutarlos resolvió mi problema:$ mv .git/refs/remotes/origin/HEAD /tmp $ git gc git prune
David Rauca
2
Sospecho que la mejor manera sería la respuesta de @ WilQu ( stackoverflow.com/a/49944297/660339 ). ¿Alguien puede confirmar esto?
Ivan Perez
eliminar esos archivos de la carpeta .git, que git gcfuncionó para mí
Vino
68

El problema con el que me encontré (que es el mismo problema que @Stavarengo mencionó en este comentario anterior) es que la rama remota predeterminada ( developen mi caso) se había eliminado, pero aún se hacía referencia en.git/refs/remotes/origin/HEAD .

La apertura .git/refs/remotes/origin/HEADen mi editor mostró esto:

ref: refs/remotes/origin/develop

Lo edité cuidadosamente para señalar mi nueva rama predeterminada y todo estaba bien:

ref: refs/remotes/origin/master

La pista que me avisó fue que la ejecución git prunemostró este error:

> git prune
warning: symbolic ref is dangling: refs/remotes/origin/HEAD
Trenton
fuente
1
Esa también fue mi solución
Dan Carlstedt
1
Esta fue mi solución exacta. Nuestro equipo recientemente cambió el uso de una rama predeterminada desarrollada para dominar también
jmancherje
40

Después de ver la respuesta de Trenton, miré .git/refs/remotes/origin/HEADy vi que también apuntaba a una rama vieja que ahora está borrada.

Pero en lugar de editar el archivo yo mismo, probé la solución de Ryan:

git remote set-head origin --auto

Estableció automáticamente el archivo en la nueva rama y git gcfuncionó bien después de eso.

WilQu
fuente
Sí, esto funciona para mí, ya que estaba exactamente en el mismo escenario. git remote set-head $REMOTE --autoen mi caso, $ REMOTE es el alias remoto, no el "origen" predeterminado, porque tengo múltiples configuraciones remotas.
Devy
29

Pensé que la solución era la siguiente, ya que parecía funcionar, pero resulta que en realidad no resuelve el problema.

git remote set-head origin --auto
Ryan
fuente
1
Parece que este comando me ayudó a deshacerme del mismo problema. Sin embargo, después de este comando, también lo usé git prune(como se recomendó en el primer resultado del comando), por lo que no puedo decir exactamente qué me ayudó: primero, segundo o ambos.
Borys Pylhun
1
git remote set-head origin --autoreparó mis archivos de referencia / control remoto / origen / HEAD sin que tuviera que usarlogit prune
danio
Encontré este error: error: Multiple remote HEAD branches. Please choose one explicitlyy tuve que usar git remote set-head origin mybranch(mientras la rama 'mybranch' estaba finalizada la compra) para que el error desapareciera.
derekmx271
3
Votar abajo porque no es una respuesta completa y puede ser engañoso.
Christian Vielma
9

Parece que sus referencias simbólicas pueden estar rotas ... Intente reemplazarlo con su rama predeterminada de esta manera: Por ejemplo, mi rama predeterminada es master

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

Eso debería arreglarlo.

Conal Trinitrotoluene Da Costa
fuente
0

Si está utilizando git worktrees, asegúrese de estar haciendo un

git worktree prune

antes de correr

git gc

Tuve un árbol de trabajo dañado y esto pareció funcionar después de eliminar el árbol de trabajo dañado. git prunepor sí solo no parecía funcionar.

JeffP
fuente
0

La causa de esto para mí fue trabajar en una carpeta comprimida en Windows. Cuando la carpeta se descomprimía, corrompía los archivos del paquete, lo que generaba otros problemas extraños, como no ser capaz de eliminar ramas inexistentes.

La única solución era borrar el directorio de trabajo y clonar los remotos remotos nuevamente. Afortunadamente, todavía podía empujar y extraer actualizaciones para asegurar que no se perdiera nada. Todo está bien ahora.

Will Strohl
fuente