39 votes

Ai-je besoin d'exécuter git gc sur un repo nu?

man git-gc n'ont pas de réponse évidente, et je n'ai pas eu de chance avec Google soit (bien que j'ai peut-être été l'utilisation de la mauvaise termes de recherche).

Je comprends que vous devriez de temps en temps exécutez git gc sur un dépôt local pour tailler des objets pendants et compresser de l'histoire, parmi d'autres choses, mais est partagée dépôt nu sensibles à ces mêmes questions?

Si c'est important, notre flux de travail est plusieurs développeurs de tirer et de pousser à un dépôt nu sur un lecteur réseau partagé. La "centrale" du référentiel a été créé avec git init --bare --shared.

31voto

Mark Rushakoff Points 97350

Comme Jefromi commenté Dan réponse, git gc devrait être appelé automatiquement appelé lors d'une utilisation "normale" d'un dépôt nu.

J'ai juste couru git gc --aggressive sur les deux nus, les dépôts communs qui ont été activement utilisé; l'un avec environ 38 engage les 3 ou 4 dernières semaines, et l'autre avec environ 488 s'engage pendant environ 3 mois. Personne n'a exécuter manuellement git gc sur le référentiel.

Les petits référentiel

$ git count-objects
333 objects, 595 kilobytes

$ git count-objects -v
count: 333
size: 595
in-pack: 0
packs: 0
size-pack: 0
prune-packable: 0
garbage: 0

$ git gc --aggressive
Counting objects: 325, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (323/323), done.
Writing objects: 100% (325/325), done.
Total 325 (delta 209), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.

$ git count-objects -v
count: 8
size: 6
in-pack: 325
packs: 1
size-pack: 324
prune-packable: 0
garbage: 0

$ git count-objects
8 objects, 6 kilobytes

Répertoire plus grand

$ git count-objects
4315 objects, 11483 kilobytes

$ git count-objects -v
count: 4315
size: 11483
in-pack: 9778
packs: 20
size-pack: 15726
prune-packable: 1395
garbage: 0

$ git gc --aggressive
Counting objects: 8548, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8468/8468), done.
Writing objects: 100% (8548/8548), done.
Total 8548 (delta 7007), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.

$ git count-objects -v
count: 0
size: 0
in-pack: 8548
packs: 1
size-pack: 8937
prune-packable: 0
garbage: 0

$ git count-objects
0 objects, 0 kilobytes

Je souhaite que je l'avais pensé, avant j' gced ces deux référentiels, mais je devrais avoir exécuté git gc sans l' --aggressive option pour voir la différence. Heureusement, j'ai une taille moyenne active référentiel de gauche à essai (164 s'engage sur près de 2 mois).

$ git count-objects -v
count: 1279
size: 1574
in-pack: 2078
packs: 6
size-pack: 2080
prune-packable: 607
garbage: 0

$ git gc
Counting objects: 1772, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1073/1073), done.
Writing objects: 100% (1772/1772), done.
Total 1772 (delta 1210), reused 1050 (delta 669)
Removing duplicate objects: 100% (256/256), done.

$ git count-objects -v
count: 0
size: 0
in-pack: 1772
packs: 1
size-pack: 1092
prune-packable: 0
garbage: 0

$ git gc --aggressive
Counting objects: 1772, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1742/1742), done.
Writing objects: 100% (1772/1772), done.
Total 1772 (delta 1249), reused 0 (delta 0)

$ git count-objects -v
count: 0
size: 0
in-pack: 1772
packs: 1
size-pack: 1058
prune-packable: 0
garbage: 0

L'exécution git gc clairement fait une grande brèche dans count-objects, même si nous avons régulièrement des push et fetch à partir de ce dépôt. Mais à la lecture de la page de manuel pour git config,, j'ai remarqué que, par défaut, lâche l'objet de la limite est de 6700, qui apparemment n'avait pas encore atteint.

Il semble donc que la conclusion est non, vous n'avez pas besoin d'exécuter git gc manuellement sur un nu-les opérations de pension;* mais avec le réglage par défaut de gc.auto, il pourrait être un long moment avant de la collecte des ordures se fait automatiquement.


*En général, vous ne devriez pas exécuter git gc. Mais parfois, vous pourriez être à court d'espace et que vous devez exécuter git gc manuellement ou gc.auto à une valeur inférieure. Mon cas pour la question était simple curiosité, si.

15voto

Dan Moulding Points 46866

De la git-gc page de man:

Les utilisateurs sont encouragés à exécuter cette tâche sur une base régulière à l'intérieur de chaque référentiel de maintenir une bonne utilisation de l'espace disque et de la bonne exploitation les performances.

C'est moi qui souligne. Nu les dépôts sont aussi des dépôts!

Plus d'explications: l'une des tâches d'entretien qu' git-gc effectue l'emballage et le remballage des objets en vrac. Même si vous n'avez jamais tout en balançant des objets dans votre dépôt nu, sera, au fil du temps -- accumuler beaucoup d'objets en vrac. Ces objets en vrac doivent être périodiquement emballé, pour plus d'efficacité. De même, si un grand nombre de packs de s'accumuler, ils devraient périodiquement obtenir remballé en plus (moins) les packs.

2voto

VonC Points 414372

Le problème avec l' git gc --auto , c'est qu'il peut être bloquant.

Mais avec la nouvelle (Git 2.0 T2 2014) paramètre gc.autodetach, maintenant vous pouvez le faire sans aucune interruption:

Voir commettre 4c4ac4d et s'engager 9f673f9 (Nguyễn Thái Ngọc Duy, aka pclouds):

gc --auto prend du temps et peut bloquer l'utilisateur temporairement (mais pas le moins gênant).
Le faire fonctionner en arrière-plan sur les systèmes qui le supportent.
La seule chose perdue avec cours d'exécution en arrière-plan d'impression. Mais gc output n'est pas vraiment intéressant.
Vous pouvez le garder à l'avant-plan en modifiant gc.autodetach.

1voto

svick Points 81772

Certaines opérations sont exécutées git gc --auto automatiquement, de sorte qu'il ne devrait jamais être le besoin pour exécuter git gc, git doit prendre soin de lui-même.

Contrairement à ce que bwawok dit, en fait, il y est (ou pourrait être) une différence entre votre local repo et qui portait un: Quelles sont les opérations que vous faites avec lui. Par exemple, en balançant les objets peuvent être créés par changement d'année de base, mais il peut être possible que vous n'avez jamais rebase le nu-repo, peut-être que vous n'avez pas besoin de les enlever (car il n'y a aucun). Et donc vous ne pouvez pas besoin d'utiliser git gc souvent. Mais encore une fois, comme je l'ai dit, git doit prendre soin de ce automatiquement.

0voto

bwawok Points 5102

Je ne connais pas à 100% la logique de gc .. mais je peux raisonner ceci:

git gc a supprimé les fichiers inutiles de l'historique, compresse l'historique, etc. Il ne fait rien avec vos copies locales de fichiers.

La seule différence entre un référentiel nu et normal est que vous disposez de copies locales de fichiers.

Donc, je pense qu'il va de soi que OUI, vous devriez exécuter git gc sur un repo nu.

Personnellement, je ne l’ai jamais fait, mais mon repo est plutôt petite et rapide.

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