Close

git gc

La commande git gc est une commande de maintenance du dépôt. Le « gc » correspond à la commande garbage collection. L'exécution de git gc revient littéralement à demander à Git de nettoyer le désordre créé dans le dépôt actuel. La commande garbage collection est un concept qui provient de langages de programmation interprétés qui effectuent une allocation dynamique de la mémoire. Dans les langages interprétés, elle est utilisée pour récupérer la mémoire devenue inaccessible pour le programme en cours d'exécution.

Les dépôts Git accumulent différents types d'informations inutiles. Un type d'informations inutiles pour Git correspond aux commits orphelins ou inaccessibles. Les commits Git peuvent devenir inaccessibles lors de l'exécution de commandes modifiant l'historique comme les commandes git reset ou git rebase. Afin de préserver l'historique et d'éviter la perte de données, Git ne supprime pas les commits détachés. Un commit détaché peut toujours faire l'objet d'un check-out, d'un cherry-pick et d'un examen par le biais de git log.

En plus du nettoyage des commits détachés, git gc effectuera également une compression sur les objets Git stockés, libérant ainsi de l'espace disque précieux. Lorsque Git identifie un groupe d'objets similaires, il les compresse dans un « pack ». Les packs fonctionnent comme des fichiers ZIP d'objets Git et se trouvent dans le répertoire ./git/objets/pack au sein d'un dépôt.


Que fait git gc en pratique ?


Avant d'être exécutée, la commande git gc vérifie tout d'abord plusieurs valeurs de git config. Ces valeurs aideront à clarifier le reste de la responsabilité de git gc.

Configuration de git gc

gc.reflogExpire

Variable facultative dont la valeur par défaut est 90 jours. Elle est utilisée pour définir la durée pendant laquelle les enregistrements d'un reflog de branches doivent être conservés.

gc.reflogExpireUnreachable

Variable facultative dont la valeur par défaut est 30 jours. Elle est utilisée pour définir la durée pendant laquelle les enregistrements de reflog inaccessibles doivent être conservés.

gc.aggressiveWindow
Bases de données
Ressource connexe

Comment déplacer un dépôt Git complet

Logo Bitbucket
DÉCOUVRIR LA SOLUTION

Découvrir Git avec Bitbucket Cloud

Variable facultative dont la valeur par défaut est 250. Elle contrôle le temps passé à créer des packs d'objets lors de la phase de compression delta lorsque la commande git gc est exécutée avec l'option --agressive.

gc.aggressiveDepth

Variable facultative dont la valeur par défaut est 50. Elle contrôle la profondeur de compression utilisée par git-repack lors d'une exécution de git gc --aggresive.

gc.pruneExpire

Variable facultative dont la valeur par défaut est « Il y a 2 semaines ». Elle définit la durée pendant laquelle un objet inaccessible sera conservé avant d'être supprimé.

gc.worktreePruneExpire

Variable facultative dont la valeur par défaut est « Il y a 3 mois ». Elle définit la durée pendant laquelle une arborescence de travail périmée sera conservée avant d'être supprimée.

Exécution de git gc

En coulisse, la commande git gc exécute en fait un bundle d'autres sous-commandes internes comme git prune, git repack, git pack et git rerere. La responsabilité générale de ces commandes est d'identifier tous les objets Git qui sont en dehors des niveaux de seuil définis dans la configuration de git gc. Une fois identifiés, ces objets sont alors compressés ou nettoyés.

Bonnes pratiques et FAQ concernant git gc


La commande garbage collection est exécutée automatiquement sur plusieurs commandes fréquemment utilisées :

La fréquence à laquelle la commande git gc doit être manuellement exécutée correspond au niveau d'activité d'un dépôt. Un dépôt avec un seul développeur contributeur devra exécuter git gc beaucoup moins souvent qu'un dépôt multi-utilisateurs fréquemment mis à jour.

Différences entre git gc et git prune


git gc est une commande parent et git prune une commande enfant. git gc déclenchera git prune en interne. La commande git prune est utilisée pour supprimer les objets Git qui ont été jugés inaccessibles par la configuration de git gc. En savoir plus sur git prune.

À quoi sert git gc aggressive ?


La commande git gc peut être invoquée avec l'option de ligne de commande --aggressive. L'option --aggressive oblige git gc à consacrer plus de temps à son effort d'optimisation. Elle ralentit l'exécution de git gc, mais elle permettra d'économiser de l'espace disque supplémentaire une fois l'opération terminée. Les effets de --aggressive sont persistants. C'est pourquoi elle ne doit être exécutée que lorsqu'un volume important de changements a été apporté à un dépôt.

À quoi sert git gc auto ?


La variante de commande git gc --auto vérifie d'abord si un grand nettoyage du dépôt est requis avant d'être exécutée. Si elle considère qu'un grand nettoyage n'est pas nécessaire, elle se ferme sans exécuter aucune tâche. Certaines commandes Git exécutent implicitement git gc --auto après leur exécution pour nettoyer tous les objets bruts qu'elles ont créés.

Avant d'être exécutée, la commande git gc --auto recherchera dans la configuration git les valeurs de seuil sur les objets bruts et la taille de compression des packs. Ces valeurs peuvent être définies avec git config. Si le dépôt dépasse l'un des seuils de nettoyage, la commande git gc --auto sera exécutée.

Premiers pas avec git gc


Vous utilisez probablement déjà git gc sans vous en rendre compte. Comme indiqué dans la section des bonnes pratiques, elle est automatiquement invoquée via des commandes fréquemment utilisées. Si vous voulez l'invoquer manuellement, exécutez simplement git gc. Une sortie indiquant les tâches effectuées doit alors s'afficher.


Partager cet article
Thème suivant

Lectures recommandées

Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.

Des personnes qui collaborent à l'aide d'un mur rempli d'outils

Le blog Bitbucket

Illustration DevOps

Parcours de formation DevOps

Démos Des démos avec des partenaires d'Atlassian

Fonctionnement de Bitbucket Cloud avec Atlassian Open DevOps

Inscrivez-vous à notre newsletter DevOps

Thank you for signing up