2012-03-31 12 views
57

Recientemente ejecuté git fsck --lost-found en mi repositorio.git: blobs colgantes

Esperaba ver un par de compromisos pendientes, donde reinicié HEAD.

Sin embargo, me sorprendió ver probablemente más de varios miles de mensajes de blob colgantes.

No creo que haya nada malo en mi repositorio, pero tengo curiosidad sobre las causas de estas burbujas. Solo hay dos personas trabajando en el repositorio, y no hemos hecho nada fuera de lo común.

No creo que hayan sido creadas por una versión anterior de un archivo reemplazado por uno nuevo, ya que git debería retener ambos blobs para que pueda mostrar el historial.

Ahora que lo pienso, en un momento agregamos un directorio MUY grande (miles de archivos) al proyecto por error y luego lo eliminamos. ¿Podría ser esta la fuente de todos los blobs que cuelgan?

Solo estoy buscando información sobre este misterio.

Respuesta

49

última vez que miré en este yo me encontré con this thread, en concreto esta parte:

También puede terminar con objetos colgantes en paquetes. Cuando ese paquete se reembala , esos objetos se aflojarán, y luego expirarán según la regla mencionada anteriormente. Sin embargo, creo que gc no siempre va a volver a embalar paquetes viejos; hará nuevos paquetes hasta que tenga muchos paquetes, y luego los combine todos (al menos eso es lo que "gc --auto" hará; I no recuerdo si solo "git gc" sigue la misma regla)

Por lo tanto, es un comportamiento normal, y se recoge eventualmente, creo.

edición: Per Daniel, puede obtener inmediatamente mediante la ejecución de

git gc --prune="0 days" 
+3

lo que ocurrirá si esos son blob quitar? – nferocious76

+0

@ nferocious76, entonces no puede recuperar archivos que, por ejemplo, se agregaron a la puesta en escena pero no se comprometieron, y luego se eliminaron (a través de rm -f). Una vez que el GC se ha ejecutado, los archivos se pierden para siempre. –

+0

@DavidBrower Veo gracias. Por lo tanto, también elimina los archivos no vinculados o no referenciados. – nferocious76

16

Siempre que add un archivo en el índice, el contenido de ese archivo se añaden a la base de datos de objetos de Git como una burbuja. Cuando a continuación, reset/rm --cached ese archivo, seguirán existiendo las manchas (que serán de basura recogen la próxima vez que ejecute gc)

Sin embargo, cuando estos archivos son parte de un cometió y decide más adelante reset historia, a continuación, los compromisos antiguos aún se pueden alcanzar desde el reflog de Git y solo se recolectarán los desechos 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 se hace referencia a ellos desde el reflog.

+2

También vale la pena señalar que si arreglas un archivo y lo vuelves a'add', el anterior se convierte en un bloque que cuelga de la misma manera. (Generalmente utilizo la secuencia: hackear, 'git add',' git diff --cached' y/o 'git status' hasta que esté contento, luego' git commit', así que obtengo muchos de estos. :-)) – torek

23

Yo estaba muy impaciente y utilizado:

git gc --prune="0 days" 
Cuestiones relacionadas