El cuello de botella de alcanzabilidad
Muchas operaciones de Git necesitan responder "¿es el commit X alcanzable desde Y?" o "¿cuál es la base de merge?" Ingenuamente esto significa recorrer el grafo de commits desde lecturas crudas de objetos — lento en repos grandes. El archivo commit-graph precomputa punteros de padres, números de generación y (opcionalmente) filtros Bloom en un archivo lateral binario.
Dónde vive
Git antiguo: .git/objects/info/commit-graph. Git nuevo: .git/objects/info/commit-graphs/.
Escribir el grafo
git commit-graph write --reachable --changed-paths
git commit-graph verify
git commit-graph write --split=replace --reachable --changed-paths
Auto-escritura
git config core.commitGraph true
git config gc.writeCommitGraph true
git config fetch.writeCommitGraph true
Números de generación
Cada commit obtiene un número topológico de generación. Comparar permite a Git saltar regiones enteras del grafo durante recorridos.
Impacto en rendimiento
En el repo de Linux (más de un millón de commits), git log --oneline | head baja de segundos a milisegundos.
Medición
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
Errores comunes
Olvidar escribir el grafo tras un push grande o rebase. Deshabilitar core.commitGraph sin darse cuenta de que muchas otras características dependen de él.