web-dev-qa-db-fra.com

Que signifie "Remplir automatiquement le référentiel pour des performances optimales"?

J'ai un problème avec mon dépôt Git. Pendant les derniers jours, chaque fois que je fais un Push au serveur, je reçois le message suivant: "Emballage automatique du référentiel pour des performances optimales", et il ne semble pas disparaître et restituer le shell.

J'ai aussi essayé de vérifier dans une nouvelle branche, puis de refaire la base de ma branche précédente, puis j'ai fait git gc pour supprimer les objets d’historique inutilisés puis faire un Push mais ce message apparaît quand même. S'il vous plaît laissez-moi savoir ce qui se passe avec mon repo.

205
Furqan Asghar

Version courte: ça veut dire ce que ça dit, et si vous le laissez finir, tout ira bien.

Au cours de la plupart des opérations pouvant potentiellement augmenter le nombre d'objets en vrac (non compressés) dans le référentiel (y compris les push), Git invoque git gc --auto. S'il y a suffisamment d'objets desserrés (au moins 6700 par défaut), il invoquera alors git repack -d -l pour les emballer. S'il y a trop de paquets séparés, ils seront également remballés 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 comme il faut du temps pour les compresser, Git crée d'abord des objets en vrac, puis les conditionne par lots de temps en temps, via l'invocation automatique de git gc --auto.

Si vous laissez Git finir de remballer, cela ne se reproduira pas avant un moment. Cela peut effectivement prendre un certain temps, surtout si vous avez beaucoup de gros objets binaires, mais si cela déclenche, Cela signifiera que cela réduira probablement considérablement la quantité d'espace disque pris par le référentiel. 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 souvent, mais cela prendra plus de temps quand cela arrivera. Si vous le diminuez, il faudra tout de même faire votre remballage en cours, mais par la suite cela se produira plus souvent et se terminera plus rapidement. Si vous le définissez sur 0, le remballage automatique sera désactivé.

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

284
Cascabel

Bien que Jefroni ait raison de dire que parfois, l’emballage automatique a juste besoin de temps, si le message d’emballage automatique persiste pendant plusieurs jours comme indiqué par OP, il y a de fortes chances que le nettoyage de git manque d’objets pendants, comme décrit dans cette question .

Pour voir si des objets en suspension déclenchent des messages en cours sur le chargement automatique, essayez de lancer git fsck. Si vous obtenez une longue liste de commits en suspens, vous pouvez les nettoyer avec

git gc --Prune=now

Je dois généralement exécuter cette opération sur mon dépôt tous les deux ou trois mois lorsque le message d'emballage automatique ne disparaît pas après un seul essai.

41
wbharding

Pour désactiver un projet:

cd your_project_dir
git config gc.auto 0

Pour désactiver globalement:

git config --global gc.auto 0
32
Anders Lindén

Git exécute git-repack, qui regroupe de nombreux objets (= fichiers, commits et arbres) dans un fichier pack. Git le fait parfois, quand une heuristique dit qu'il peut y avoir un gain de place (un fichier de pack contient des deltas d'objet compressés, tandis que chaque fichier du répertoire object/contient le contenu complet du fichier compressé)

10
Rudi

Espérons que cela git gc --auto _ step est maintenant (Git 2.0.1, 25 juin 2014) plus efficace.
Voir commit 62aad18 par Nguyễn Thái Ngọc Duy (pclouds)

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

9f673f9 (gc: l'option de configuration permettant d'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 consiste en des paquets-ref et des reflogs de taille. Celles-ci nécessitent le verrouillage de certaines références et peuvent interrompre d'autres processus essayant de verrouiller la même référence.

Si gc --auto _ est déclenché au milieu d'un script, le verrouillage de gc en arrière-plan pourrait faire échouer le script, ce qui ne pourrait jamais arriver avant 9f673f9 .

Continuer à courir pack-refs et "reflog --Prune "en avant-plan pour arrêter les mises à jour des références parallèles. Les opérations en arrière-plan restantes (remballer, Pruner et rerere) ne devraient pas avoir d’impact sur les processus git en cours d’exécution.

Et Git 2.22 (T2 2019) optimise davantage git gc .

1
VonC