Je les ai essayés, mais mon dépôt était encore très grand. Le problème était que j'avais accidentellement enregistré des fichiers volumineux générés. Après quelques recherches, j'ai trouvé un excellent tutoriel qui permet de supprimer facilement les gros fichiers générés. Ce tutoriel m'a permis de réduire mon référentiel de 60 Mo à < 1 Mo.
Steve Lorek, Comment réduire un dépôt Git ?
Mise à jour : Voici une version copier-coller de l'article de blog.
Comment réduire un dépôt Git ?
La taille de notre dépôt Git principal avait soudainement explosé. Il était passé en une nuit à 180 Mo (compressé) et prenait une éternité à cloner.
La raison était évidente ; quelqu'un, quelque part, avait commis des fichiers massifs. Mais nous n'avions aucune idée de ce qu'étaient ces fichiers.
Après quelques heures d'essais, d'erreurs et de recherches, j'ai réussi à mettre au point un processus :
- Découvrez les grands dossiers
- Nettoyez-les du référentiel
- Modifier le dépôt distant (GitHub) pour que les fichiers ne soient plus jamais téléchargés
Ce processus ne doit jamais être tenté, sauf si vous pouvez garantir que tous les membres de l'équipe peuvent produire un nouveau clone. Il implique la modification de l'historique et exige que toute personne contribuant au dépôt retire le dépôt nouvellement nettoyé avant d'y pousser quoi que ce soit.
Clone profond du référentiel
Si vous n'avez pas encore de clone local du référentiel en question, créez-en un maintenant :
git clone remote-url
Maintenant, vous avez peut-être cloné le référentiel, mais vous n'avez pas toutes les branches distantes. C'est impératif pour assurer un bon "nettoyage en profondeur". Pour ce faire, nous aurons besoin d'un petit script en Bash :
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
git branch --track ${branch##*/} $branch
done
Merci à bigfish sur StackOverflow pour ce script, qui est copié mot à mot.
Copiez ce code dans un fichier, chmod +x filename.sh
et l'exécuter ensuite avec ./filename.sh
. Vous aurez maintenant toutes les branches distantes également (c'est dommage que Git ne fournisse pas cette fonctionnalité).
Découvrir les gros fichiers
Le crédit est dû à Antony Stubbs ici - e script de Bash identifie les plus gros fichiers d'un dépôt Git local, et est reproduit textuellement ci-dessous :
#!/bin/bash
#set -x
# Shows you the largest objects in your repo's pack file.
# Written for osx.
#
# @see http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
# @author Antony Stubbs
# set the internal field spereator to line break, so that we can iterate easily over the verify-pack output
IFS=$'\n';
# list all objects including their size, sort by size, take top 10
objects=`git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head`
echo "All sizes are in kB. The pack column is the size of the object, compressed, inside the pack file."
output="size,pack,SHA,location"
for y in $objects
do
# extract the size in bytes
size=$((`echo $y | cut -f 5 -d ' '`/1024))
# extract the compressed size in bytes
compressedSize=$((`echo $y | cut -f 6 -d ' '`/1024))
# extract the SHA
sha=`echo $y | cut -f 1 -d ' '`
# find the objects location in the repository tree
other=`git rev-list --all --objects | grep $sha`
#lineBreak=`echo -e "\n"`
output="${output}\n${size},${compressedSize},${other}"
done
echo -e $output | column -t -s ', '
Exécutez ce script comme précédemment, et vous verrez une sortie similaire à celle ci-dessous :
All sizes are in kB. The pack column is the size of the object, compressed, inside the pack file.
size pack SHA location
1111686 132987 a561d25105c79aa4921fb742745de0e791483afa 08-05-2012.sql
5002 392 e501b79448b9e970ab89b048b3218c2853fdfc88 foo.sql
266 249 73fa731bb90b04dcf79eeea8fdd637ba7df4c089 app/assets/images/fw/iphone.fw.png
265 43 939b31c563bd40b1ca70e4f4a9f7d67c27c936c0 doc/models_complete.svg
247 39 03514d9e84418573f26b205bae7e4e57057c036f unprocessed_email_replies.sql
193 49 6e601c4067aaddb26991c4bd5fbddef003800e70 public/assets/jquery-ui.min-0424e108178defa1cc794ee24fc92d24.js
178 30 c014b20b6fed9f17a0b2809ac410d74f291da26e foo.sql
158 158 15f9e56bc0865f4f303deff053e21909661a716b app/assets/images/iphone.png
103 36 3135e15c5cec75a4c85a0636b154b83221020c97 public/assets/application-c65733a4a64a1a885b1c32694574b12a.js
99 85 c1c80bc4c09e692d5e2127e39c87ecacdb1e816f app/assets/images/fw/lovethis_logo_sprint.fw.png
Oui, on dirait que quelqu'un a poussé des fichiers inutiles quelque part ! Y compris un joli 1.1GB présent sous la forme d'un fichier de vidage SQL.
Nettoyage des fichiers
Le nettoyage du fichier prendra un certain temps, en fonction de l'activité de votre dépôt. Vous avez juste besoin d'une commande pour commencer le processus :
git filter-branch --tag-name-filter cat --index-filter 'git rm -r --cached --ignore-unmatch filename' --prune-empty -f -- --all
Cette commande est adaptée d'autres sources - le principal ajout est le suivant --tag-name-filter cat
ce qui garantit que les balises sont également réécrites.
Après l'exécution de cette commande, votre dépôt devrait maintenant être nettoyé, avec toutes les branches et balises intactes. Récupérer de l'espace
Nous avons peut-être réécrit l'histoire du dépôt, mais ces fichiers existent toujours, ils volent de l'espace disque et sont généralement nuisibles. Supprimons ces bâtards :
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
Maintenant nous avons un dépôt frais et propre. Dans mon cas, il est passé de 180MB à 7MB.
Pousser le référentiel nettoyé
Nous devons maintenant pousser les changements vers le dépôt distant, afin que personne d'autre ne subisse la douleur d'un téléchargement de 180 Mo.
git push origin --force --all
El --all
argument pousse toutes vos branches aussi bien. C'est pourquoi nous avions besoin de les cloner au début du processus.
Puis poussez les balises nouvellement réécrites :
git push origin --force --tags
Dites à vos coéquipiers
Toute autre personne disposant d'un clone local du référentiel devra utiliser soit git rebase
ou créez un nouveau clone, sinon lorsqu'ils poussent à nouveau, ces fichiers seront poussés en même temps et le référentiel sera remis dans l'état dans lequel il était auparavant.
2 votes
Pouvez-vous afficher la sortie de
git count-objects -v
?4 votes
Duplicata possible de Réduire la taille du dépôt git
0 votes
Mon problème était
git lfs
prenait des tonnes d'espace dans le.git/lfs
dir. En exécutantgit lfs prune
J'ai réduit mon.git
taille du dossier par >60 GO ! J'ai ajouté ces informations et d'autres encore dans ma réponse ici .