Que signifie «Emballage automatique du référentiel pour des performances optimales»?

225

J'ai un problème avec mon dépôt git. Au cours des deux derniers jours, chaque fois que je fais une poussée vers le serveur, je reçois ce message: "Emballage automatique du référentiel pour des performances optimales", et il ne semble pas disparaître et renvoyer le shell.

J'ai également essayé de vérifier dans une nouvelle branche, puis de rebaser sur ma branche précédente, puis git gcde supprimer les objets d'historique inutilisés, puis de faire une poussée, mais ce message apparaît toujours. Veuillez me faire savoir ce qui se passe avec mon dépôt.

Furqan Asghar
la source

Réponses:

305

Version courte: cela veut dire ce qu'elle dit, et si vous la laissez simplement finir, tout ira bien.

Pendant la plupart des opérations qui peuvent potentiellement augmenter le nombre d'objets lâches (décompressés) dans le référentiel (y compris les push), Git invoque git gc --auto. S'il y a suffisamment d'objets en vrac (par défaut, au moins 6700), il sera alors invoqué git repack -d -lpour les emballer. S'il y a trop de packs séparés, il les remballera également en un seul.

Un pack est un fichier unique compressé en delta, contenant un grand nombre d'objets. Il est plus efficace de stocker des objets dans des packs, mais cela prend du temps pour emballer (compresser) des objets, donc Git crée initialement des objets en vrac, puis les emballe par lots de temps en temps, via l'appel automatique de git gc --auto.

Si vous laissez Git terminer le reconditionnement, cela ne se reproduira pas avant un certain temps. Cela peut en effet prendre un certain temps, surtout si vous avez beaucoup de gros objets binaires, mais si cela se déclenche, c'est un signe que cela réduira probablement considérablement la quantité d'espace disque prise par le dépôt. Si vous ne voulez vraiment pas que cela se produise, vous pouvez modifier le paramètre de configuration gc.auto. Si vous l'augmentez à quelque chose de beaucoup plus grand que 6700, cela se produira moins fréquemment, mais prendra plus de temps quand il le fera. Si vous le diminuez, il devra toujours faire votre remballage actuel, mais par la suite, cela se produira plus souvent et se terminera plus rapidement. Si vous le définissez sur 0, il désactivera le reconditionnement automatique.

Voir man git-gc(sous --auto) et man git-config(sous gc.auto) pour plus d'informations.

Cascabel
la source
14
En effet, cela m'a pris environ 5 minutes, mais cela a fini. Très bonne réponse.
Joshua Pinter
6
Nous le voyons se produire à chaque poussée (en faisant quelques secondes, hé).
2
@dpk: Cela ne devrait pas se produire dans des circonstances normales - le nombre d'objets en une seule poussée ne doit pas être assez grand pour le déclencher (à moins que votre référentiel soit énorme et / ou que vous poussiez une tonne de commits), donc une fois qu'il réussit complète (vous la laissez se terminer, non?) cela ne devrait pas se reproduire tant que vous ne l'avez pas construit. Si vous ne pouvez pas le comprendre, posez une question distincte.
Cascabel
6
"Si vous laissez Git finir", et cela peut ... fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack- c'est ce que j'obtiens en collant l'intégralité de notre base de code dans un seul dépôt git. Je suppose que je vais tuer les applications et forcer le reconditionnement "manuellement"
ruffin
11
Je l'obtiens à chaque fois que je fais un pull. J'ai fait un git gc manuel, mais cela arrive toujours à chaque fois que je tire. Bizarre.
Barry Kelly
51

Bien que Jefroni ait raison de dire que parfois l'auto-emballage a juste besoin de temps pour se terminer, si le message d'auto-emballage persiste pendant plusieurs jours comme le décrit OP, il y a de fortes chances que le nettoyage de git manque des objets pendants, comme décrit dans cette question .

Pour voir si des objets suspendus déclenchent des messages en cours sur la compression automatique, essayez de l'exécuter git fsck. Si vous obtenez une longue liste de validations pendantes, vous pouvez les nettoyer avec

git gc --prune=now

Je dois généralement exécuter cela sur mon référentiel tous les 2-3 mois lorsque le message d'emballage automatique ne disparaît pas après une seule traction.

wbharding
la source
5
Bien que ce ne soit pas la réponse acceptée, c'était exactement ce dont j'avais besoin. J'ai reçu le message chaque fois que j'ai fait un git pull, pendant plusieurs jours, et j'ai en fsckeffet montré une tonne de commits pendantes.
Jörn Zaefferer
36

Pour désactiver pour un projet:

cd your_project_dir
git config gc.auto 0

Pour désactiver globalement:

git config --global gc.auto 0
Anders Lindén
la source
2
Je pense avoir découvert comment: allez dans le dossier .git, ouvrez le fichier de configuration, supprimez le texte «auto = 0» et enregistrez. Cela semble réactiver l'empaquetage automatique.
Adrian Keister
18
git config --unset gc.auto
jtatum
10

Git exécute git-repack, qui regroupe de nombreux objets (= fichiers, validations et arborescences) dans un seul fichier pack. Git le fait parfois, lorsqu'une heuristique dit qu'il peut y avoir de l'espace (un fichier pack contient des deltas d'objets compressés, tandis que chaque fichier dans le répertoire objets / contient le contenu complet du fichier compressé)

Rudi
la source
2

Espérons que cette git gc --autoétape soit désormais plus efficace (git 2.0.1, 25 juin 2014).
Voir commit 62aad18 par Nguyễn Thái Ngọc Duy ( pclouds)

gc --auto: ne pas verrouiller les références en arrière-plan

9f673f9 ( gc: option de configuration pour exécuter --auto en arrière-plan - 2014-02-08, Git 2.0.0) met " gc --auto" en arrière-plan pour réduire le temps d'attente de l'utilisateur.
Une partie de la collecte des ordures est constituée par les références de pack et les reflogs d'élagage. Celles-ci nécessitent le verrouillage de certaines références et peuvent annuler d'autres processus essayant de verrouiller la même référence.

Si gc --autoest déclenché au milieu d'un script, les verrous de maintien de gc en arrière-plan pourraient faire échouer le script, ce qui ne pourrait jamais se produire avant 9f673f9 .

Continuez à courir pack-refset " reflog --prune" au premier plan pour arrêter les mises à jour des références parallèles. Les opérations d'arrière-plan restantes (reconditionnement, élagage et reréré) ne devraient pas avoir d'impact sur les processus git en cours d'exécution.

Et Git 2.22 (Q2 2019) optimise davantagegit gc .

VonC
la source