Le goulot d'atteignabilité
De nombreuses opérations Git doivent répondre "le commit X est-il atteignable depuis Y ?" ou "quelle est la base de merge ?" Naïvement cela signifie parcourir le graphe de commits depuis des lectures brutes d'objets — lent sur les gros repos. Le fichier commit-graph précalcule les pointeurs parents, les numéros de génération et (optionnellement) les filtres Bloom.
Où il vit
Git ancien : .git/objects/info/commit-graph. Git moderne : .git/objects/info/commit-graphs/.
Écrire le graphe
git commit-graph write --reachable --changed-paths
git commit-graph verify
git commit-graph write --split=replace --reachable --changed-paths
Auto-écriture
git config core.commitGraph true
git config gc.writeCommitGraph true
git config fetch.writeCommitGraph true
Numéros de génération
Chaque commit reçoit un numéro topologique de génération.
Impact sur la performance
Sur le repo Linux (plus d'un million de commits), git log --oneline | head passe de secondes à millisecondes.
Mesure
git -c core.commitGraph=false log -100 --pretty=oneline >/dev/null
time git -c core.commitGraph=false log --oneline | head -10000 >/dev/null
time git log --oneline | head -10000 >/dev/null
Erreurs courantes
Oublier d'écrire le graphe après un gros push ou rebase.