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

Introducción

Git almacena objetos en dos formatos físicos. Los objetos sueltos son archivos individuales; los objetos empaquetados viven dentro de un archivo pack con un cuerpo comprimido con delta. Ambas formas describen los mismos objetos lógicos, direccionados por los mismos hashes.

Disposición de sueltos

Cada objeto suelto está en .git/objects/xx/yyy..., donde xx son los primeros dos chars hex del SHA y yyy... los 38 restantes. El archivo es los bytes desinflados con zlib de <type> <size>\0<content>:

find .git/objects -type f -name '??' -prune -o -type f -print | head
git cat-file -p <sha>

Disposición de pack

.git/objects/pack/pack-<hash>.pack
.git/objects/pack/pack-<hash>.idx

El archivo .idx mapea SHA a offset de bytes dentro del .pack; sin él, el pack requeriría un escaneo lineal.

Cómo se mueven los objetos entre formas

Los objetos nuevos se escriben sueltos. Se vuelven empaquetados cuando:

  • Se ejecuta git gc (manual o automático).
  • Se invoca git repack.
  • Un fetch o push los transfiere como un pack.
  • git fast-import los escribe directamente en un pack.
git gc
git repack -a -d
git count-objects -v

count-objects -v reporta el conteo de sueltos, uso total de disco y estadísticas de pack.

Compromisos

  • Sueltos: simple, fácil de inspeccionar, rápido para escribir un solo objeto. Lento cuando hay millones.
  • Empaquetados: compactos, comprimidos con delta, rápidos para lectura masiva. Requieren reempaquetar para incorporar nuevos objetos.

Auto-gc

Git dispara un auto-gc cuando se acumulan demasiados objetos sueltos. Ajustables:

git config gc.auto 6700           # umbral para objetos sueltos
git config gc.autoPackLimit 50    # umbral para número de packs
git config gc.auto 0              # deshabilitar auto-gc (no recomendado)

Inspeccionando un pack

git verify-pack -v .git/objects/pack/pack-<hash>.idx | head
git verify-pack -s .git/objects/pack/pack-<hash>.idx

Verás tipos de objeto, tamaños empaquetados, deltas y profundidades de cadena.

Recuperando de corrupción

git fsck --full
cp -r broken-repo backup
git unpack-objects < .git/objects/pack/pack-<hash>.pack

unpack-objects explota un pack de vuelta a forma suelta, útil cuando un solo objeto malo dentro de un pack está derribando muchas operaciones.

Buscando un objeto

Cuando Git resuelve un SHA, busca en este orden: archivo de objeto suelto, luego cada idx de pack, luego alternates (objects/info/alternates). La búsqueda es esencialmente de tiempo constante por pack gracias a la tabla fanout del idx. El impacto en rendimiento de tener muchos packs pequeños vs un pack grande es real, por lo que gc consolida:

git count-objects -v
cat .git/objects/info/alternates 2>/dev/null
git verify-pack -s .git/objects/pack/pack-<hash>.idx

Los alternates permiten a múltiples repos compartir un pool de objetos en disco; git clone --shared crea tal configuración y ahorra espacio al costo de algo de seguridad.

Errores comunes

Eliminar manualmente archivos pack- para reclamar espacio; eso destruye historial alcanzable. Usa git gc. Deshabilitar auto-gc en repos de larga duración y terminar con millones de objetos sueltos, ralentizando cada operación. Ejecutar git gc --aggressive regularmente cuando un gc normal serviría; el empaquetamiento agresivo es caro. Finalmente, copiar un repo con cp -r mientras un pack se está escribiendo, terminando con un index corrupto. Usa git clone --local para copias seguras.