Por qué el índice es lento
Incluso con sparse checkout, el índice por defecto contiene una entrada por archivo en todo el repo — un millón de entradas en un monorepo, incluso si solo mil están presentes en el árbol de trabajo. El sparse index (Git 2.37+) reemplaza directorios excluidos con una sola entrada de tree.
Habilitación
git sparse-checkout init --cone --sparse-index
git config index.sparse true
git update-index --sparse
Cómo funciona
Cada directorio excluido se representa en el índice como una entrada de modo 040000 (tree) con el SHA de su tree commiteado.
Inspección
git ls-files --sparse | head
git ls-files -t | grep ^S | head
GIT_TRACE2_PERF=1 git status 2>&1 | grep sparse
Números de rendimiento
En un monorepo del mundo real con 4M de archivos, el equipo de Microsoft Office reportó git status bajando de 3 segundos a menos de 200ms. El tamaño del archivo de índice bajó de 350MB a 5MB.
Compatibilidad
Muchos comandos son sparse-aware: status, add, commit, diff, checkout, reset, restore, stash, ls-files.
Forzar expansión
git update-index --no-sparse
git update-index --sparse
Errores comunes
Intentar habilitar el sparse index en modo sparse-checkout no-cono — rechazado.