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.
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.