Pourquoi la taille importe
La taille du dépôt affecte la vitesse de clone, le temps de fetch, le coût CI et la réactivité de l'IDE.
Le one-liner classique
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
awk '/^blob/ {print $3, $4}' | \
sort -n | tail -20
Taille par répertoire
git ls-tree -r -l HEAD | \
awk '{ size[$5] += $4 } END { for (f in size) print size[f], f }' | \
sort -rn | head -20
Inspection de fichiers pack
git verify-pack -v .git/objects/pack/pack-*.idx | \
sort -k 3 -n | tail -20
Utiliser git-sizer
brew install git-sizer
git-sizer --verbose
Tracer un blob spécifique
git rev-list --all --objects | grep <sha>
git log --all --find-object=<sha>
Supprimer les gros fichiers de l'historique
pip install git-filter-repo
git filter-repo --strip-blobs-bigger-than 50M
git filter-repo --invert-paths --path huge.psd
Vérifier le nettoyage
git gc --aggressive --prune=now
du -sh .git
git-sizer
Prévenir la récurrence
#!/usr/bin/env bash
MAX=10000000
git diff --cached --numstat | while read added removed file; do
size=$(git cat-file -s :$file 2>/dev/null || echo 0)
if [ "$size" -gt "$MAX" ]; then
echo "Refus de commit $file: $size octets" >&2
exit 1
fi
done