web-dev-qa-db-fra.com

Comment puis-je déclencher un garbage collection sur un référentiel distant Git?

Comme nous le savons, nous pouvons exécuter périodiquement git gc pour emballer les objets sous .git/objects.

Dans le cas d'un référentiel Git central distant (nu ou non), cependant, après de nombreuses poussées, il y a beaucoup de fichiers sous myproj.git/objects; chaque commit semble y créer un nouveau fichier.

Comment puis-je emballer autant de fichiers? (Je veux dire ceux du référentiel nu distant distant, pas du référentiel de clone local.)

50
peterwang

Le référentiel distant doit être configuré pour exécuter gc selon les besoins une fois la validation effectuée. Consultez la documentation de gc.auto dans les pages de manuel git-gc et git-config.

Cependant, un dépôt à distance ne devrait pas nécessiter autant de collecte de déchets, car il aura rarement des validations pendantes (inaccessibles). Celles-ci résultent généralement de choses comme la suppression et le rebasage de branches, qui se produisent généralement uniquement dans les référentiels locaux.

Donc, gc est plus nécessaire pour le reconditionnement, qui est pour économiser de l'espace de stockage plutôt que pour supprimer les ordures réelles. La variable gc.auto est suffisante pour s'en occuper.

49
Neil Mayhew

Bien que vous devriez avoir un processus qui s'occupe de cela périodiquement, automatiquement, ce n'est pas un problème

git gc

sur un référentiel nu

git@domU:/pix/git/repositories/abd.git$ ls -l

total 28
drwxrwxr-x   2 git git    6 2010-06-06 02:44 branches
-rw-rw-r--   1 git git   66 2010-06-06 02:44 config
-rw-r--r--   1 git git   23 2011-03-15 18:19 description
-rw-rw-r--   1 git git   23 2010-06-06 02:44 HEAD
drwxrwxr-x   2 git git 4096 2010-06-06 02:44 hooks
drwxrwxr-x   2 git git   20 2010-06-06 02:44 info
drwxrwxr-x 260 git git 8192 2010-09-01 00:26 objects
drwxrwxr-x   4 git git   29 2010-06-06 02:44 refs

$ git gc
Counting objects: 3833, done.
Compressing objects:  31% (1085/3500)...
13
user122299

Cette question devrait faire la lumière sur la fréquence à laquelle vous devez exécuter la récupération de place.

L'option la plus simple serait d'utiliser une tâche planifiée dans Windows ou un travail cron sous Unix pour exécuter git gc périodiquement. De cette façon, vous n'avez même pas besoin d'y penser.

4
Igor Zevaka

après de nombreuses poussées, il y a beaucoup de fichiers sous myproj.git/objects

Il n'y en aura pas autant avec git 2.11+ (Q4 2016) et un crochet de pré-réception.
Dans ce scénario, vous n'aurez pas à déclencher un git gc du tout .

Voir commit 62fe0eb , commit e34c2e , commit 722ff7f , commit 2564d99 , commit 526f108 (03 octobre 2016) par Jeff King (peff) .
(Fusionné par Junio ​​C Hamano - gitster - in commit 25ab004 , 17 octobre 2016)

receive-pack: mettre les objets en quarantaine jusqu'à ce que la pré-réception accepte

Pour que l'extrémité réceptrice de "git Push" inspecte l'historique reçu et décide de rejeter la poussée, les objets envoyés depuis l'extrémité émettrice doivent être mis à la disposition du crochet et du mécanisme de vérification de la connectivité, et cela a été fait traditionnellement en stockant les objets dans le référentiel de réception et en laissant "git gc "pour le faire expirer.

Au lieu de cela, stockez les objets nouvellement reçus dans une zone temporaire et rendez-les disponibles en réutilisant le mécanisme de magasin d'objets alternatif uniquement pendant que nous décidons si nous acceptons la vérification, et une fois que nous décidons, migrez-les vers le référentiel ou purgez-les immédiatement .

Cette zone temporaire sera définie par la nouvelle variable d'environnement GIT_QUARANTINE_ENVIRONMENT.

De cette façon, si un (gros) Push est rejeté par un pre-receive crochet, ces gros objets ne resteront pas dans les 90 jours en attendant git gc pour les nettoyer.

3
VonC