git: gotas colgantes
git-dangling (3)
Cada vez que add
un archivo al índice, el contenido de ese archivo se agrega a la base de datos de objetos de Git como un blob. Cuando luego reset
/ rm --cached
ese archivo, las manchas seguirán existiendo (se recogerán en la basura la próxima vez que ejecute gc
)
Sin embargo, cuando esos archivos son parte de un compromiso y usted decide más tarde reset
historial, los antiguos compromisos aún son accesibles desde el reflog de Git y solo se recolectarán como basura después de un período de tiempo (generalmente un mes, iirc). Sin embargo, esos objetos no deberían aparecer como colgantes, ya que todavía están referenciados en el reflog.
Recientemente ejecuté git fsck --lost-found
en mi repositorio.
Esperaba ver un par de compromisos colgando, donde había reiniciado HEAD
.
Sin embargo, me sorprendió ver probablemente más de varios miles de mensajes blob colgando.
No creo que nada esté mal con mi repositorio, pero tengo curiosidad por saber qué causa estas burbujas colgantes. Solo hay dos personas trabajando en el repositorio, y no hemos hecho nada fuera de lo común.
No creo que hayan sido creados por una versión anterior de un archivo reemplazado por uno nuevo, ya que git tendría que mantener ambos blobs para poder mostrar el historial.
Ahora que lo pienso, en un momento dado, agregamos por error un directorio MUY grande (miles de archivos) al proyecto y luego lo eliminamos. ¿Podría ser esta la fuente de todas las burbujas que cuelgan?
Solo busco conocer este misterio.
Estaba realmente impaciente y acostumbrada:
git gc --prune="0 days"
La última vez que miré esto, tropecé con este hilo , específicamente esta parte:
También puedes terminar con objetos colgantes en paquetes. Cuando se vuelve a empaquetar ese paquete, esos objetos se aflojarán y, finalmente, caducarán según la regla mencionada anteriormente. Sin embargo, creo que gc no siempre volverá a empaquetar paquetes viejos; creará nuevos paquetes hasta que tengas muchos paquetes, y luego los combinarás todos (al menos eso es lo que hará "gc --auto"; no recuerdo si solo "git gc" sigue la misma regla).
Así que es un comportamiento normal, y eventualmente se recoge, creo.
Edición: Per Daniel, puedes recogerlo inmediatamente corriendo
git gc --prune="0 days"