141 votes

Comment ignorer la popup "Objet lâche" lors de l'exécution de 'git gui'

Lorsque j'exécute 'git gui', je reçois une fenêtre contextuelle qui dit

Ce dépôt contient actuellement environ 1500 objets non liés.

Il suggère ensuite de compresser la base de données. Je l'ai déjà fait auparavant, et cela réduit les objets non liés à environ 250, mais cela n'empêche pas la fenêtre contextuelle de s'afficher. Compresser à nouveau ne change pas le nombre d'objets non liés.

Notre flux de travail actuel nécessite une utilisation importante de 'rebase' car nous passons de Perforce et Perforce est toujours le GCS canonique. Une fois que Git sera le GCS canonique, nous ferons des fusions régulières, et le problème des objets non liés devrait être grandement atténué.

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

4 votes

Ce dialogue est un excellent exemple d'une "fonctionnalité" que beaucoup de gens souhaiteraient qu'elle n'existe pas. Non seulement elle est ennuyeuse, mais elle peut effacer des commits importants devenus détachés après une réinitialisation difficile.

199voto

Esko Luontola Points 53877

Comme personne n'avait encore de réponse, j'ai regardé dans le code pour voir comment supprimer le code qui affiche ce dialogue. J'ai trouvé la procédure hint_gc qui le fait et l'endroit où elle est appelée. En même temps, j'ai remarqué qu'à la fin de 2011, une option de configuration pour désactiver le dialogue a été ajoutée. Ce changement (partie de git-gui 0.16.0) a été fusionné dans la version principale de Git le 14 décembre 2011.

Donc, si vous utilisez Git v1.7.9 ou une version plus récente, vous pouvez désactiver le dialogue d'avertissement avec la commande suivante :

git config --global gui.gcwarning false

Si vous utilisez une version plus ancienne, vous pouvez modifier /lib/git-core/git-gui et supprimer la ligne after 1000 hint_gc, ou modifier /usr/share/git-gui/lib/database.tcl et supprimer le contenu de la procédure hint_gc. (Ces chemins de fichiers sont pour Cygwin - dans d'autres environnements, les fichiers pourraient être à des emplacements différents. Pour Windows, c'est c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

3 votes

Pouvons-nous augmenter après 1000 hint_gc afin que l'avertissement se produise après 10000 objets perdus ?

0 votes

@sashoalm Je suis d'accord. C'est là pour une raison.

0 votes

Se demandant quelles sont exactement les bonnes raisons, ce dialogue est tellement pénible, sans bonnes raisons clairement expliquées, je suis vraiment tenté de simplement ajouter la commande ci-dessus.

53voto

VonC Points 414372

Mise à jour : git prune permettrait de "résoudre" le problème, en ce sens qu'il supprimera ces objets non référencés
(git gc appelle git prune, mais seulement pour les objets non référencés de plus de deux semaines, par défaut).
Cependant, comme le mentionne l'OP Michael Donohue dans les commentaires :

J'aime bien l'aspect sécuritaire de conserver les objets non référencés pendant deux semaines, au cas où je voudrais revenir en arrière et consulter d'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 lorsque 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 les objets non référencés a été signalé auparavant (fin 2008, ""git gc" semble ne plus supprimer les objets non référencés")

git gc ne supprime que les objets non référencés 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, sinon il pourrait potentiellement perturber quelque chose.

"git gc" va décompresser les objets devenus inaccessibles et qui étaient actuellement dans des packs.
Par conséquent, la quantité d'espace disque utilisée par un dépôt git peut en réalité augmenter de façon spectaculaire après une opération "git gc", ce qui pourrait surprendre quelqu'un qui est proche de la saturation de son système de fichiers, supprime un certain nombre de branches d'un dépôt de suivi, et exécute ensuite un "git gc" peut avoir une très mauvaise surprise.

[Exemple :] Les anciennes branches sont réservées via une balise telle que next-20081204.
Si vous mettez à jour votre copie locale du dépôt linux-next tous les jours, vous accumulerez un grand nombre de ces anciennes balises de branches.
Si vous supprimez ensuite toute une série d'entre elles, et exécutez git-gc, l'opération prendra un certain temps, et le nombre de blocs et d'inodes utilisés augmentera significativement.

Ils disparaîtront après un "git prune", mais lorsque j'effectue cette opération de maintenance, j'ai souvent souhaité une option --oui-je-sais-ce-que-je-fais-et-c'est-dangereux-mais-juste-supprimez-les-objets-inaccessibles-car-il-s'agit-juste-d'un-dépôt-de-suivi pour "git gc".

Alors dans votre cas, un "git prune" serait-il utile ?

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


Vous avez également (de la même discussion) :

repack -a -d -l

Remarquez le 'a' en minuscules.

git-gc appelle repack avec un 'A' en majuscules, ce qui fait que les objets inaccessibles sont décompréssés. En minuscules, c'est pour les personnes qui savent ce qu'elles font, et qui veulent que git supprime simplement les objets inaccessibles.

1 votes

'git prune' résoudrait probablement mon problème immédiat - je vais essayer plus tard aujourd'hui. Cependant, j'aime bien l'aspect sécurité de garder les objets non utilisés pendant deux semaines, au cas où je voudrais revenir en arrière et consulter d'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 compresser la base de données n'aurait aucun effet.

0 votes

Très commentaire utile. Ce message ennuyeux de "loose object" était vraiment ennuyeux. D'où vient ce compte de toute façon? La sortie de git-fsck, peut-être?

0 votes

Merci - j'avais aussi des objets inutiles que git gc ne supprimait pas - git prune était la réponse.

36voto

Nick Dandoulakis Points 26809

Lorsque la fenêtre contextuelle "Loose Object" apparaît, je sais qu'il est temps d'exécuter le collecteur de déchets de git :

git gc

Après cela, la fenêtre contextuelle disparaît.

Mise à jour : (grâce à la suggestion de T.E.D.)

J'ai extrait la routine ci-dessous de git/share/git-gui/lib/database.tcl
Vous pouvez la 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 "Ce dépôt a actuellement environ %i objets volants.

Pour maintenir des performances optimales, il est fortement recommandé de compresser la base de données lorsqu'il y a plus de %i objets volants.

Voulez-vous compresser la base de données maintenant ?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}

1 votes

Ne cliquez-vous pas sur OK dans la boîte de dialogue? Si le gc n'avait pas supprimé tous les objets non utilisés, il aurait toujours eu la boîte de dialogue.

0 votes

J'ai cliqué sur 'OK' et j'ai exécuté 'git gc' depuis la ligne de commande - ils me descendent tous les deux à 250, mais recommencer ne fait pas progresser davantage.

3 votes

Je sais que c'est bizarre mais nettoyer la base à partir de l'interface graphique laisse parfois des objets non utilisés. Je ferme l'interface graphique, lance git-gc, et ensuite toute la mémoire inutilisée est supprimée.

3voto

T.E.D. Points 26829

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

Je suppose que vous pourriez toujours télécharger sa source, retirer le code du dialogue et reconstruire.

1voto

Valmond Points 1012

Pour ajouter aux réponses et explications :

Si vous voulez continuer à surveiller les objets non utilisés, mais ne voulez pas que la fenêtre contextuelle disparaisse complètement (elle apparaît tout le temps pour les projets plus importants), vous pouvez modifier le fichier database.tcl qui se trouve probablement dans ce dossier :

C:\Program Files\Git\mingw64\share\git-gui\lib\

Dans la fonction proc hint_gc {}

proc hint_gc {} {

set ndirs 1
set limit 8
if {[is_Windows]} {
    set ndirs 8
    set limit 1
}

Vous pouvez changer le

set ndirs 8

à

set ndirs 32

par exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X