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
Ressource connexe
Comment déplacer un dépôt Git complet
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.