git garbage-collection rebase git-gui git-gc

Cómo saltarse la ventana emergente "Loose Object" cuando se ejecuta ''git gui''



garbage-collection rebase (4)

Actualización: git prune "resolvería" el problema, ya que eliminará esos objetos sueltos
( git gc llama a git prune , pero solo para objetos sueltos de más de dos semanas, por defecto).
Sin embargo, como menciona el en los comentarios:

Me gusta el aspecto de seguridad de mantener los objetos sueltos por alrededor de dos semanas, si quiero volver atrás y mirar algunas revisiones antiguas, así que realmente no me gusta esta solución.
No estoy teniendo problemas con el tamaño o el rendimiento de git, es solo ''git gui'' que insiste en pedirme que comprima la base de datos, incluso cuando comprimir la base de datos no tendría ningún efecto.

Respuesta original:

El problema de " git gc " no eliminar todos los objetos sueltos se ha informado antes (finales de 2008, " git gc " ya no parece eliminar los objetos sueltos "

git gc solo elimina objetos sueltos de más de dos semanas, si realmente quieres eliminarlos ahora, ejecuta git prune.
Pero asegúrate de que ningún otro proceso de git pueda estar activo cuando lo ejecutas, o podría pisar algo.

" git gc " descomprimirá los objetos que se han vuelto inalcanzables y se encontraban actualmente en paquetes.
Como resultado, la cantidad de espacio en disco utilizado por un repositorio de git puede aumentar drásticamente después de una operación " git gc ", que podría ser sorprendente para alguien que está ejecutando casi todo su sistema de archivos, elimina una cantidad de ramas de un archivo. seguimiento de repositorio, y luego hace un " git gc " puede obtener una sorpresa muy desagradable.

[ Ejemplo: ] Las ramas antiguas se reservan mediante una etiqueta como next-20081204 .
Si actualiza su copia local del repositorio de linux-next todos los días, acumulará una gran cantidad de estas antiguas etiquetas de ramificación.
Si luego elimina una serie completa de ellos y ejecuta git-gc , la operación llevará bastante tiempo, y la cantidad de bloques e inodos utilizados aumentará significativamente.

Desaparecerán después de una " git prune ", pero cuando realizo esta operación de limpieza, a menudo he deseado un " --yes-I-know-what-I-am-doing-and-it''s-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository option to "git gc".

Entonces, en tu caso, ¿sería útil una " git prune "?

(posiblemente con el uso de "ahora" en la variable de configuración gc.pruneexpire , necesaria para que ocurra el comportamiento anterior).

También tienes (del mismo hilo):

repack -a -d -l

Observe la ''a'' minúscula.

git-gc llama a reempaquetar con mayúscula ''A'', que es lo que hace que los objetos inalcanzables sean desempaquetados. Poco ''a'', es para personas que saben lo que están haciendo, y quieren que Git simplemente arroje objetos inalcanzables.

Cuando ejecuto ''git gui'' aparece una ventana emergente que dice

This repository currently has approximately 1500 loose objects.

Luego sugiere comprimir la base de datos. He hecho esto antes, y reduce los objetos sueltos a aproximadamente 250, pero eso no suprime la ventana emergente. Comprimir de nuevo no cambia la cantidad de objetos sueltos.

Nuestro flujo de trabajo actual requiere un uso significativo de ''rebase'' ya que estamos en transición desde Perforce, y Perforce sigue siendo el SCM canónico. Una vez que Git sea el SCM canónico, haremos fusiones regulares, y el problema de los objetos sueltos debería mitigarse en gran medida.

Mientras tanto, me gustaría hacer desaparecer esta ventana emergente ''útil''.


Cuando aparezca la ventana emergente "Loose Object", sé que es hora de ejecutar el recolector de basura de git:

git gc

Después de eso, la ventana emergente se va.

Actualización: (debido a la sugerencia de TED)

Extraje la rutina a continuación de git/share/git-gui/lib/database.tcl
Puede modificarlo para satisfacer sus necesidades.

proc hint_gc {} { set object_limit 8 if {[is_Windows]} { set object_limit 1 } set objects_current [llength [glob / -directory [gitdir objects 42] / -nocomplain / -tails / -- / *]] if {$objects_current >= $object_limit} { set objects_current [expr {$objects_current * 256}] set object_limit [expr {$object_limit * 256}] if {[ask_popup / [mc "This repository currently has approximately %i loose objects. To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist. Compress the database now?" $objects_current $object_limit]] eq yes} { do_gc } } }


Hmmmm ... No veo un argumento de línea de comandos para eso en los docs .

Supongo que siempre se puede extraer su fuente, sacar el código para el diálogo y reconstruir.


Como nadie tenía todavía una respuesta, busqué en el código para ver cómo eliminar el código que muestra ese diálogo. Encontré el procedimiento hint_gc que lo hace y el lugar donde se llama. Al mismo tiempo, noté que a fines de 2011 se agregó una opción de configuración para deshabilitar el diálogo . Este cambio (parte de git-gui 0.16.0) se fusionó con la línea principal de Git en 2011-12-14 .

Por lo tanto, si usa Git v1.7.9 o una versión más nueva, puede desactivar el cuadro de diálogo de advertencia con el siguiente comando:

git config --global gui.gcwarning false

Si está utilizando una versión anterior, puede editar /lib/git-core/git-gui y eliminar la línea after 1000 hint_gc , o editar /usr/share/git-gui/lib/database.tcl y eliminar el cuerpo del procedimiento hint_gc . (Estas rutas de archivos están en Cygwin; en otros entornos, los archivos pueden estar en ubicaciones diferentes. Para Windows, es c:/Program Files/Git/mingw64/libexec/git-core/git-gui.tcl )