Por Anónimo (no verificado) , 29 Abril 2026

Por qué importa el tamaño

El tamaño del repositorio afecta velocidad de clone, tiempo de fetch, costo de CI y respuesta del IDE. Un solo binario de 200 MB commiteado una vez y eliminado sigue en tu repo para siempre.

El one-liner clásico

git rev-list --objects --all | \
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
  awk '/^blob/ {print $3, $4}' | \
  sort -n | tail -20

Tamaño por directorio

git ls-tree -r -l HEAD | \
  awk '{ size[$5] += $4 } END { for (f in size) print size[f], f }' | \
  sort -rn | head -20

Inspección de archivos pack

git verify-pack -v .git/objects/pack/pack-*.idx | \
  sort -k 3 -n | tail -20

Usar git-sizer

brew install git-sizer
git-sizer --verbose

Rastrear un blob específico

git rev-list --all --objects | grep <sha>
git log --all --find-object=<sha>

Eliminar archivos grandes de la historia

pip install git-filter-repo
git filter-repo --strip-blobs-bigger-than 50M
git filter-repo --invert-paths --path huge.psd

Verificar la limpieza

git gc --aggressive --prune=now
du -sh .git
git-sizer

Prevenir recurrencia

#!/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 "Rechazando commit de $file: $size bytes" >&2
    exit 1
  fi
done