El tamaño de basura Git está fuera de control, es necesario entender

estamos usando git como nuestro DVCS para un proyecto muy grande (sí, sé que no siempre se lo señala como el mejor para estas situaciones), y hay algo que no entiendo muy bien acerca de mi repository.

Este es mi resultado de contar objects:

count: 53 size: 1.57 MiB in-pack: 26444 packs: 2 size-pack: 42.49 GiB prune-packable: 0 garbage: 8 size-garbage: 32.22 GiB 

como puede ver, el tamaño es inferior a 2Mb, el tamaño del package es de 43Gb (¿qué es esto, exactamente?), ¡pero el tamaño de la basura es 32Gb! ¿Que es eso? ¿Puedo eliminarlo? ¿Cómo?

Probé muchas opciones encontradas en Internet con muy poca comprensión de lo que hacen en un repository separado, básicamente sin ganancias ni cambios importantes. Me gusta:

 git reflog expire --all --expire=now git gc --prune=now --aggressive git gc git repack -a -d --depth=250 --window=250 

 git reflog expire --all --expire=now 

Normalmente no desea utilizar esto como usuario final, pero puede ser útil si introdujo una cantidad masiva de datos que terminó sacándolo de la sucursal (como al restablecer a una confirmación anterior y generar un nuevo compromiso). sin los datos). En este caso, todavía tendría una reference activa a los datos en el reflog, y git mantendría los objects hasta que expiraran.

 git gc --prune=now --aggressive 

Evita la opción --aggressive . Hace demasiado trabajo con muy poca ganancia, en mi experiencia. Sin embargo, la variante git gc --prune=now es probablemente lo que quieres. Esto eliminará cualquier dato sin reference. En general, Git guarda datos no referencedos por un par de semanas, pero eso puede sumr bastante rápido. Además, volverá a empaquetar el depósito, lo que puede ahorrar bastante espacio en comparación con los objects sueltos (los objects sueltos no se comprimen).

 git gc 

Esta forma de git gc puede ser útil también. Todavía se poda, pero utilizando el marco de time pnetworkingeterminado en su lugar. Cualquier cosa que sea más joven que la pnetworkingeterminada se dejará como un object suelto, por lo que si intentas mejorar el espacio en disco, no recomendaría este formulario.

 git repack -a -d --depth=250 --window=250 

Este ha estado fuera por un time, pero generalmente se aplica erróneamente. Esto solo es útil si ha convertido su repository de otro sistema de control de versiones, y el process de conversión no eligió buenos padres para empacar. También es muy costoso de computar y tardará mucho time en terminar. En los repositorys que se convirtieron con malas opciones delta, puede marcar una gran diferencia. Pero no es probable lo que estás buscando.

 count: 53 size: 1.57 MiB in-pack: 26444 packs: 2 size-pack: 42.49 GiB prune-packable: 0 garbage: 8 size-garbage: 32.22 GiB 

como puede ver, el tamaño es inferior a 2Mb, el tamaño del package es de 43Gb (¿qué es esto, exactamente?), ¡pero el tamaño de la basura es 32Gb! ¿Que es eso? ¿Puedo eliminarlo? ¿Cómo?

size refiere a los objects sueltos en el disco a los que se hace reference actualmente. Esto podría ser a través del reflog, las twigs, los controles remotos, etc. El size-garbage campo de la size-garbage es el más interesante. Estos son datos que no están referencedos actualmente y están disponibles para la recolección de basura. git gc lo eliminaría ahora, siempre y cuando tenga más de 2 semanas. git gc --prune=now lo eliminaría a pesar de su edad.

Entonces, al final, es probable que git gc --prune=now quiera ejecutar en el repository.