J'ai un dépôt git de 300 Mo. La taille totale de mes fichiers actuellement extraits est de 2 Mo et la taille totale du reste du dépôt git est de 298 Mo. Il s'agit essentiellement d'un dépôt uniquement en code qui ne devrait pas dépasser quelques Mo.
Je soupçonne que quelqu'un a accidentellement commis de gros fichiers (vidéo, images, etc.), puis les a supprimés ... mais pas de git, donc l'historique contient toujours de gros fichiers inutiles. Comment trouver les gros fichiers dans l'historique git? Il y a plus de 400 commits, donc un par un n'est pas pratique.
REMARQUE : ma question n'est pas de savoir comment supprimer le fichier , mais comment le trouver en premier lieu.
Réponses:
J'ai trouvé ce script très utile dans le passé pour trouver des objets volumineux (et non évidents) dans un référentiel git:
Cela vous donnera le nom d'objet (SHA1sum) du blob, puis vous pouvez utiliser un script comme celui-ci:
... pour trouver le commit qui pointe vers chacun de ces blobs.
la source
🚀 Une doublure de coque incroyablement rapide 🚀
Ce script shell affiche tous les objets blob dans le référentiel, triés du plus petit au plus grand.
Pour mon échantillon repo, il a fonctionné environ 100 fois plus vite que les autres trouvés ici.
Sur mon fidèle système Athlon II X4, il gère le référentiel Linux Kernel avec ses 5,6 millions d'objets en un peu plus d'une minute .
Le script de base
Lorsque vous exécutez le code ci-dessus, vous obtiendrez une belle sortie lisible par l'homme comme ceci:
Utilisateurs de macOS : Étant donné qu'il
numfmt
n'est pas disponible sur macOS, vous pouvez soit omettre la dernière ligne et gérer les tailles d'octets brutes, soitbrew install coreutils
.Filtration
Pour obtenir un filtrage supplémentaire , insérez l'une des lignes suivantes avant la
sort
ligne .Pour exclure les fichiers présents dans
HEAD
, insérez la ligne suivante:Pour n'afficher que les fichiers dépassant la taille donnée (par exemple 1 Mio = 2 20 B), insérez la ligne suivante:
Sortie pour ordinateurs
Pour générer une sortie mieux adaptée à un traitement ultérieur par les ordinateurs, omettez les deux dernières lignes du script de base. Ils font tout le formatage. Cela vous laissera quelque chose comme ceci:
Suppression de fichiers
Pour la suppression réelle du fichier, consultez cette question SO sur le sujet .
la source
brew install coreutils
puis remplacercut
pargcut
etnumfmt
pargnumfmt
.git large
quelqu'un?J'ai trouvé une solution monoplace sur la page wiki du Département de physique de l'ETH Zurich (près de la fin de cette page). Faites juste un
git gc
pour enlever les déchets périmés, puisvous donnera les 10 plus gros fichiers du référentiel.
Il existe également une solution plus paresseuse maintenant disponible, GitExtensions a maintenant un plugin qui le fait dans l'interface utilisateur (et gère également les réécritures de l'historique).
la source
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Étape 1 Écrivez tous les fichiers SHA1 dans un fichier texte:
Étape 2 Triez les blobs du plus grand au plus petit et écrivez les résultats dans un fichier texte:
Étape 3a Combinez les deux fichiers texte pour obtenir le nom du fichier / sha1 / informations sur la taille:
Étape 3b Si vous avez des noms de fichiers ou des chemins contenant des espaces, essayez cette variante de l'étape 3a. Il utilise
cut
au lieu deawk
pour obtenir les colonnes souhaitées incl. espaces de la colonne 7 à la fin de la ligne:Vous pouvez maintenant consulter le fichier bigtosmall.txt afin de décider quels fichiers vous souhaitez supprimer de votre historique Git.
Étape 4 Pour effectuer la suppression (notez que cette partie est lente car elle va examiner chaque commit de votre historique pour les données sur le fichier que vous avez identifié):
La source
Les étapes 1 à 3a ont été copiées à partir de la recherche et de la purge de gros fichiers de l'historique Git
ÉDITER
L'article a été supprimé au cours du second semestre 2017, mais une copie archivée de celui-ci est toujours accessible à l'aide de Wayback Machine .
la source
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Notez que vous devez entrer le caractère TAB réel aprèsjoin -t'
avec CTRL + V <TAB> per geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
devrait vous donner un onglet.echo -n $'\t' | xxd -ps
->09
Vous devez utiliser BFG Repo-Cleaner .
Selon le site Internet:
La procédure classique pour réduire la taille d'un référentiel serait:
la source
--strip-biggest-blobs 500
-il?Si vous voulez seulement avoir une liste de fichiers volumineux, alors je voudrais vous fournir le one-liner suivant:
Dont la sortie sera:
La dernière entrée de la liste pointe vers le plus gros fichier de votre historique git.
Vous pouvez utiliser cette sortie pour vous assurer que vous ne supprimez pas avec BFG des éléments dont vous auriez eu besoin dans votre historique.
la source
1.1, 1.2, 2.3
chiffres?<filenumber>.<field>
spécification de l'ordre de la combinaison. Voir man.cx/join pour plus d'informations.Si vous êtes sous Windows, voici un script PowerShell qui imprimera les 10 plus gros fichiers de votre référentiel:
la source
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Cependant, cette réponse a fonctionné: stackoverflow.com/a/57793716/2441655 (elle est également plus courte)Essayez
git ls-files | xargs du -hs --threshold=1M
.Nous utilisons la commande ci-dessous dans notre pipeline CI, elle s'arrête si elle trouve des gros fichiers dans le dépôt git:
la source
Je n'ai pas pu utiliser la réponse la plus populaire car le
--batch-check
commutateur de ligne de commande vers Git 1.8.3 (que je dois utiliser) n'accepte aucun argument. Les étapes suivantes ont été essayées sur CentOS 6.5 avec Bash 4.1.2Concepts clés
Dans Git, le terme blob implique le contenu d'un fichier. Notez qu'un commit peut changer le contenu d'un fichier ou d'un nom de chemin. Ainsi, le même fichier peut faire référence à un autre blob en fonction de la validation. Un certain fichier peut être le plus gros de la hiérarchie de répertoires dans un commit, mais pas dans un autre. Par conséquent, la question de trouver des commits volumineux au lieu de fichiers volumineux met les choses dans la bonne perspective.
Pour les impatients
La commande pour imprimer la liste des blobs dans l'ordre décroissant de taille est:
Exemple de sortie:
Pour supprimer de tels blobs, utilisez le BFG Repo Cleaner , comme mentionné dans d'autres réponses. Étant donné un fichier
blobs.txt
qui contient uniquement les hachages de blob, par exemple:Faire:
La question est de trouver les commits, ce qui est plus de travail que de trouver des blobs. Pour le savoir, lisez la suite.
La poursuite des travaux
Étant donné un hachage de validation, une commande qui affiche les hachages de tous les objets qui lui sont associés, y compris les blobs, est:
Donc, si nous avons de telles sorties disponibles pour toutes les validations dans le référentiel, étant donné un hachage de blob, le groupe de validations sont celles qui correspondent à l'une des sorties. Cette idée est encodée dans le script suivant:
Si le contenu est enregistré dans un fichier nommé
find-commits.sh
alors une invocation typique sera comme sous:Comme précédemment, le fichier
blobs.txt
répertorie les hachages d'objets blob, un par ligne. Lacreate_db()
fonction enregistre un cache de toutes les listes de commit dans un sous-répertoire du répertoire courant.Quelques statistiques de mes expériences sur un système avec deux processeurs Intel (R) Xeon (R) CPU E5-2620 2.00GHz présentés par l'OS comme 24 cœurs virtuels:
Notez que le script est monothread. Par conséquent, un seul cœur serait utilisé à la fois.
la source
Solution Powershell pour Windows Git, trouvez les plus gros fichiers:
la source
Commencez par analyser, valider et sélectionner la cause première. Utilisez
git-repo-analysis
pour aider.Vous pouvez également trouver de la valeur dans les rapports détaillés générés par BFG Repo-Cleaner , qui peuvent être exécutés très rapidement en clonant vers une gouttelette Digital Ocean en utilisant leur débit réseau de 10 Mo / s.
la source
Je suis tombé dessus pour la même raison que n'importe qui d'autre. Mais les scripts cités ne fonctionnaient pas tout à fait pour moi. J'en ai fait un qui est plus un hybride de ceux que j'ai vus et il vit maintenant ici - https://gitlab.com/inorton/git-size-calc
la source