web-dev-qa-db-fra.com

Comment ignorer la fenêtre contextuelle "Objet lâche" lors de l'exécution de 'git gui'

Lorsque je lance "git gui", j'obtiens une fenêtre contextuelle qui dit

 Ce référentiel contient actuellement environ 1 500 objets en vrac. 

Il suggère ensuite de compresser la base de données. J'ai déjà fait cela auparavant, et cela réduit les objets en vrac à environ 250, mais cela ne supprime pas le popup. La compression à nouveau ne modifie pas le nombre d'objets en vrac.

Notre flux de travail actuel nécessite une utilisation importante de "rebase" pendant la transition de Perforce, et Perforce est toujours le SCM canonique. Une fois que Git est le SCM canonique, nous ferons des fusions régulières, et le problème des objets libres devrait être grandement atténué.

En attendant, j'aimerais vraiment que cette fenêtre contextuelle disparaisse.

113
Michael Donohue

Puisque personne n'avait encore de réponse, j'ai examiné le code pour voir comment supprimer le code qui affiche cette boîte de dialogue. J'ai trouvé le hint_gc procédure qui le fait et l'endroit où il est appelé. En même temps, j'ai remarqué que fin 2011 il y avait ajouté ne option de configuration pour désactiver la boîte de dialogue . Cette modification (faisant partie de git-gui 0.16.0) a été fusionnée avec la ligne principale de Git le 2011-12-14 .

Donc, si vous utilisez Git v1.7.9 ou plus récent, vous pouvez désactiver la boîte de dialogue d'avertissement avec la commande suivante:

git config --global gui.gcwarning false

Si vous utilisez une ancienne version, vous pouvez modifier /lib/git-core/git-gui et supprimez le after 1000 hint_gc ligne, ou modifiez /usr/share/git-gui/lib/database.tcl et retirez le corps du hint_gc procédure. (Ces chemins de fichiers se trouvent sur Cygwin - dans d'autres environnements, les fichiers peuvent se trouver dans des emplacements différents. Pour Windows, c'est c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

152
Esko Luontola

Mise à jour: git Prune "résoudrait" le problème, en ce sens qu'il supprimera ces objets en vrac
( git gc appelle git Prune, mais uniquement pour les objets libres de plus de deux semaines, par défaut).
Cependant, comme le OP Michael Donohue le mentionne dans les commentaires:

J'aime l'aspect sécurité de garder les objets en vrac pendant deux semaines, si je veux revenir en arrière et regarder quelques anciennes révisions, donc je n'aime pas vraiment cette solution.
Je n'ai aucun problème avec la taille ou les performances de git, c'est juste 'git gui' qui insiste pour me demander de compresser la base de données, même si la compression de la base de données n'aurait aucun effet.


Réponse originale:

Le problème de "git gc "ne supprimant pas tous des objets en vrac ont été signalés auparavant (fin 2008," "git gc "ne semble plus supprimer les objets libres "

git gc ne supprime que les objets libres de plus de deux semaines, si vous voulez vraiment les supprimer maintenant, exécutez git Prune.
Mais assurez-vous qu'aucun autre processus git ne peut être actif lorsque vous l'exécutez, ou il pourrait éventuellement marcher sur quelque chose.

"git gc "va décompresser les objets qui sont devenus inaccessibles et qui étaient actuellement dans des packs.
Par conséquent, la quantité d'espace disque utilisée par un référentiel git peut en fait augmenter considérablement après un "git gc ", ce qui pourrait être surprenant pour une personne qui exécute presque complètement sur son système de fichiers, supprime un certain nombre de branches d'un référentiel de suivi, puis effectue une opération" git gc "peut obtenir une surprise très désagréable.

[Exemple:] Les anciennes branches sont réservées via une balise telle que next-20081204.
Si vous mettez à jour votre copie locale du linux-next référentiel chaque jour, vous accumulerez un grand nombre de ces anciennes balises de branche.
Si vous en supprimez ensuite toute une série et exécutez git-gc, l'opération prendra un certain temps et le nombre de blocs et d'inodes utilisés augmentera considérablement.

Ils disparaîtront après un "git Prune ", mais quand je fais cette opération de ménage, j'ai souvent souhaité 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 pour "git gc".

Dans votre cas, un "git Prune" soit utile?

(éventuellement en utilisant "now" dans le gc.pruneexpire variable de configuration, nécessaire pour que le comportement ci-dessus se produise).


Vous disposez également (du même fil):

repack -a -d -l

Remarquez le "a" minuscule.

git-gc appelle reconditionnement avec 'A' majuscule qui est ce qui provoque le décompactage des objets inaccessibles. Le petit "a" est destiné aux personnes qui savent ce qu'elles font et qui veulent que git laisse tomber des objets inaccessibles.

47
VonC

Lorsque le popup "Loose Object" je sais qu'il est temps d'exécuter le garbage collector de git:

git gc

Après cela, le popup disparaît.

Mise à jour: (en raison de la suggestion de T.E.D.)

J'ai extrait la routine ci-dessous de git/share/git-gui/lib/database.tcl
Vous pouvez le modifier pour répondre à vos besoins.

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
        }
    }
}
30
Nick Dandoulakis

Hmmmm .... Je ne vois pas d'argument en ligne de commande pour cela dans le docs .

Je suppose que vous pouvez toujours retirer sa source, retirer le code de la boîte de dialogue et reconstruire.

3
T.E.D.