16 Packfiles

16.1 Por qué existen

Guardar cada objeto como un archivo individual comprimido es simple, pero ineficiente para repositorios con muchísimos objetos: muchos archivos pequeños desperdician espacio y son lentos de transferir por red. Periódicamente —o al ejecutar git gc manualmente— Git empaqueta los objetos sueltos en un packfile: un único archivo que contiene muchos objetos comprimidos juntos, aprovechando además que objetos similares (como dos versiones consecutivas del mismo archivo) suelen compartir mucho contenido, lo que permite guardar solo las diferencias entre ellos internamente.

16.2 Recolección de basura

git gc

Además de empaquetar objetos sueltos, elimina objetos que ya no son alcanzables desde ninguna referencia: por ejemplo, el commit original que quedó huérfano tras un commit --amend (see Deshacer cambios), una vez que pasó suficiente tiempo desde que dejó de estar referenciado. Por eso, inmediatamente después de un amend o un reset --hard, el commit "perdido" normalmente sigue existiendo en la base de datos y puede recuperarse (see Refs y reflog); solo desaparece definitivamente tras la recolección de basura.

16.3 Verificar la integridad del repositorio

git fsck

Recorre toda la base de datos de objetos verificando su consistencia interna, y reporta objetos dañados o inalcanzables. Es la herramienta de diagnóstico de última instancia cuando algo en el repositorio parece corrupto.