Cómo omitir la ventana emergente "Objeto suelto" cuando se ejecuta 'git gui'

123

Cuando ejecuto 'git gui' me sale una ventana emergente que dice

Este repositorio actualmente tiene aproximadamente 1500 objetos sueltos.

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' a medida que hacemos la transición de 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, realmente me gustaría hacer que esta ventana emergente 'útil' desaparezca.

Michael Donohue
fuente
1
Ese diálogo es un gran ejemplo de una "característica" que muchas personas desearían que no existiera. No solo es molesto, puede borrar compromisos importantes que se desprenden después de un restablecimiento completo.
adelriosantiago

Respuestas:

169

Como nadie tenía aún una respuesta, busqué en el código para ver cómo eliminar el código que muestra ese diálogo. Encontré el hint_gcprocedimiento que lo hace y el lugar donde se llama. Al mismo tiempo, noté que a finales 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 el 14/12/2011 .

Entonces, si usa Git v1.7.9 o posterior, puede deshabilitar 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-guiy eliminar la after 1000 hint_gclínea, o editar /usr/share/git-gui/lib/database.tcly eliminar el cuerpo del hint_gcprocedimiento. (Estas rutas de archivo se encuentran en Cygwin; en otros entornos, los archivos pueden estar en ubicaciones diferentes. Para Windows lo es c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

Esko Luontola
fuente
3
¿Podemos aumentar after 1000 hint_gcpara que la advertencia ocurra después de 10000objetos sueltos?
sashoalm
@sashoalm Estoy de acuerdo. Está ahí por una razón.
HankCa
Preguntándome cuáles son exactamente las buenas razones, ese diálogo es tan doloroso, sin buenas razones explicadas claramente, ciertamente estoy muy tentado de golpear el comando anterior.
Josh Mc
2
@sashoalm: Quizás esto es lo que quieres decir, pero el "1000" se after 1000refiere a la cantidad de milisegundos que hay que esperar hasta que se muestre el cuadro de diálogo. Al aumentarlo a "10000", el cuadro de diálogo seguirá apareciendo, pero tardará 10 segundos en hacerlo.
fuglede
1
Sin embargo, como se menciona en la respuesta de @ NickDandoulakis, database.tclcontiene la definición del límite y se puede aumentar para que el diálogo sea menos frecuente.
fuglede
50

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

Me gusta el aspecto de seguridad de mantener los objetos sueltos durante dos semanas, en caso de que quiera volver y ver algunas revisiones antiguas, por lo que realmente no me gusta esta solución.
No tengo ningún problema 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 ya se informó (a fines de 2008, " " git gc"ya no parece eliminar objetos sueltos "

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

" git gc" desempaquetará los objetos que se han vuelto inalcanzables y que actualmente están en paquetes.
Como resultado, la cantidad de espacio en disco utilizado por un repositorio git puede aumentar dramáticamente después de una " git gc" operación, lo que podría sorprender a alguien que se está ejecutando casi por completo en su sistema de archivos, elimina una cantidad de ramas de un repositorio de seguimiento , y luego " 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 linux-nextrepositorio todos los días, acumulará una gran cantidad de estas etiquetas de rama antiguas.
Si luego elimina una serie completa de ellos y ejecuta git-gc, la operación tomará bastante tiempo, y la cantidad de bloques e inodos utilizados crecerá significativamente.

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

Entonces, en su caso, ¿ git prunesería útil un " "?

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


También tienes (del mismo hilo):

repack -a -d -l

Observe la minúscula 'a'.

git-gcllama a reempaquetar con mayúscula 'A', que es lo que hace que los objetos inalcanzables se desempaquetan La pequeña 'a' es para personas que saben lo que están haciendo y quieren que git simplemente deje caer objetos inalcanzables.

VonC
fuente
1
'git prune' probablemente resolvería mi problema inmediato; lo intentaré más tarde hoy. Sin embargo, me gusta el aspecto de seguridad de mantener los objetos sueltos durante dos semanas, si quisiera regresar y ver algunas revisiones antiguas, por lo que no me gusta esta solución. No tengo ningún problema 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.
Michael Donohue
comentario muy útil Ese molesto mensaje de "objeto suelto" se estaba volviendo realmente molesto. ¿De dónde viene ese recuento de todos modos? ¿La salida de git-fsck, tal vez?
David Dombrowsky, el
gracias - también tenía objetos sueltos que git gc no estaba quitando - git prune fue la respuesta.
Shedd
Hice una poda git fuera de cualquier repositorio y eliminó algunos de los objetos. Luego entré en el repositorio de problemas e hice una poda git y todos los problemas desaparecieron.
Nicholas Orlowski
"git prune" resuelve el problema que OP (y yo) tenía: "He hecho esto antes, y reduce los objetos sueltos a aproximadamente 250, pero eso no suprime la ventana emergente".
Eike
32

Cuando aparece 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 desaparece.

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

Extraje la siguiente rutina de git/share/git-gui/lib/database.tcl
Puede modificarla 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
        }
    }
}
Nick Dandoulakis
fuente
1
¿Hacer clic en Aceptar en el cuadro de diálogo hace exactamente eso? Si gc no se deshacía de todos los objetos sueltos, todavía obtendría el diálogo.
TED
Hice clic en 'Aceptar' y ejecuté 'git gc' desde la línea de comando; ambos me reducen a 250, pero hacerlo de nuevo no avanza más.
Michael Donohue
3
Sé que es extraño, pero limpiar la base de la interfaz gráfica a veces deja objetos sueltos. Cierro la interfaz gráfica de usuario, ejecuto git-gc, y luego toda la basura se ha ido.
Nick Dandoulakis
3
Cambiar el tcl lo soluciona. Acabo de subir el límite de Windows a 10 * 250. ¡Gracias!
Michael Donohue
para mí correr git gcdesde la línea de comando resolvió el problema ... simplemente hacer clic oken git gui de alguna manera no funcionó ...
Rafael
3

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

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

TED
fuente