Pourquoi l'index est lent
Même avec sparse checkout, l'index par défaut contient une entrée par fichier dans tout le repo — un million d'entrées sur un monorepo, même si seulement mille sont présents dans l'arbre de travail. Le sparse index (Git 2.37+) remplace les répertoires exclus par une seule entrée tree.
Activation
git sparse-checkout init --cone --sparse-index
git config index.sparse true
git update-index --sparse
Comment ça marche
Chaque répertoire exclu est représenté dans l'index comme une entrée de mode 040000 (tree) avec le SHA de son tree commité.
Inspection
git ls-files --sparse | head
git ls-files -t | grep ^S | head
GIT_TRACE2_PERF=1 git status 2>&1 | grep sparse
Chiffres de performance
Sur un monorepo réel de 4M fichiers, l'équipe Microsoft Office a rapporté git status passant de 3 secondes à moins de 200ms. La taille du fichier index est passée de 350MB à 5MB.
Compatibilité
De nombreuses commandes sont sparse-aware : status, add, commit, diff, checkout, reset, restore, stash, ls-files.
Forcer l'expansion
git update-index --no-sparse
git update-index --sparse
Erreurs courantes
Tenter d'activer le sparse index en mode sparse-checkout non-cône — refusé.