Il collo di bottiglia della raggiungibilita
Molte operazioni Git devono rispondere a "il commit X e raggiungibile da Y?" o "qual e la merge-base?". Il file commit-graph precalcola puntatori ai genitori, numeri di generazione, e (opzionalmente) Bloom filter in un file binario laterale.
Dove vive
Git vecchio: .git/objects/info/commit-graph. Git nuovo: .git/objects/info/commit-graphs/ (concatenati, scrivibili incrementalmente).
Scrivere il grafo
git commit-graph write --reachable --changed-paths
git commit-graph verify
git commit-graph write --split=replace --reachable --changed-paths
Auto-write
git config core.commitGraph true
git config gc.writeCommitGraph true
git config fetch.writeCommitGraph true
Numeri di generazione
Ogni commit ottiene un numero di generazione topologica. La "data corretta del commit" (Git 2.30+) accelera ulteriormente le query.
Impatto sulle performance
Sul repo Linux (oltre un milione di commit), git log --oneline | head scende da secondi a millisecondi.
Misurazione
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
Errori comuni
Dimenticare di scrivere il grafo dopo un grande push o rebase.