Der Erreichbarkeits-Engpass
Viele Git-Operationen mussen "ist Commit X von Y aus erreichbar?" oder "welcher Commit ist die Merge-Basis?" beantworten. Die Commit-Graph-Datei berechnet Eltern-Zeiger, Generations-Nummern und (optional) Bloom-Filter in einer binaren Seitendatei vor.
Wo sie lebt
Alteres Git: .git/objects/info/commit-graph. Neueres Git: .git/objects/info/commit-graphs/ (verkettet).
Den Graphen schreiben
git commit-graph write --reachable --changed-paths
git commit-graph verify
git commit-graph write --split=replace --reachable --changed-paths
Auto-Schreiben
git config core.commitGraph true
git config gc.writeCommitGraph true
git config fetch.writeCommitGraph true
Generations-Nummern
Jeder Commit erhalt eine topologische Generations-Nummer.
Performance-Auswirkung
Im Linux-Repo (uber eine Million Commits) sinkt git log --oneline | head von Sekunden auf Millisekunden.
Messung
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
Haufige Fehler
Vergessen, den Graphen nach einem grossen Push oder Rebase zu schreiben.