588 votes

Comment trouver / identifier les gros fichiers / commits dans l'historique Git?

J'ai un repo git de 300 MO. Mon extrait les fichiers de peser de 2 MO, et le repo git pèse 298 MO. Il s'agit d'un code-seulement repo qui ne doit pas peser plus de quelques MO.

Probablement, quelqu'un à un certain point commis quelque lourde fichiers par accident (vidéo, des images énormes, etc), avant de les supprimer...mais pas à partir de git, de sorte que nous avons une histoire avec inutile de gros fichiers. Comment traquer les gros fichiers dans l'historique de git? Il y a 400+ s'engage, afin d'aller de l'un par l'exige beaucoup de temps.

NOTE: ma question n'est pas sur comment faire pour supprimer le fichier, mais comment trouver en premier lieu.

191voto

skolima Points 12221

J'ai trouvé un one-liner solution sur l'ETH de Zurich, Département de Physique de la page. Il suffit de faire une git gc pour éliminer les cochonneries, et puis

git rev-list --objects --all | grep `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}'`

vous donnera les 10 plus gros fichiers dans le référentiel.

Il y a aussi un lazier solution maintenant disponible, GitExtensions a maintenant un plugin qui fait cela dans l'INTERFACE utilisateur (et poignées réécrit l'histoire en tant que bien).

GitExtensions 'Find large files' dialog

175voto

Mark Longair Points 93104

J'ai trouvé ce script très utile dans le passé pour trouver de gros (et non évidente) des objets dans un dépôt git:

Qui va vous donner le nom de l'objet (SHA1sum) de la goutte, et puis vous pouvez utiliser un script comme celui-ci:

... pour trouver la commettre que des points à chacune de ces gouttes.

38voto

friederbluemle Points 796

Écrire tous les fichiers SHA1s dans un fichier texte:

git rev-list --objects --all | sort -k 2 > allfileshas.txt

Trier les objets blob à partir du plus grand au plus petit et écrire les résultats dans un fichier texte:

git gc && git verify-pack -v .git/objects/pack/pack-*.idx | egrep "^\w+ blob\W+[0-9]+ [0-9]+ [0-9]+$" | sort -k 3 -n -r > bigobjects.txt

Combiner à la fois des fichiers de texte pour obtenir de nom de fichier/sha1/informations sur la taille:

for SHA in `cut -f 1 -d\  < bigobjects.txt`; do
echo $(grep $SHA bigobjects.txt) $(grep $SHA allfileshas.txt) | awk '{print $1,$3,$7}' >> bigtosmall.txt
done;

Maintenant, vous pouvez regarder le fichier bigtosmall.txt afin de choisir les fichiers que vous souhaitez supprimer à partir de votre historique de Git.

Prises à partir de ce post

17voto

Warren Seine Points 545

Vous devriez essayer BFG Repo-Cleaner .

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