Herramientas lineales, repos exponenciales
Git fue originalmente afinado para el kernel de Linux — grande para 2005 pero pequeño para hoy. Los repos modernos pueden albergar millones de archivos, cientos de gigabytes de historia y decenas de miles de refs. Muchas operaciones de Git eran O(tamaño del árbol) u O(historia) por defecto, y a escala se volvieron visiblemente lentas.
Dónde se va el tiempo
git statusrecorre el árbol de trabajo para detectar cambios.git log,git blamey cálculos de merge-base recorren grafos de commits.git fetchnegocia con el servidor sobre muchos cambios de ref.git gcrepacka cada objeto, incluso los no cambiados.- El índice se lee y escribe muchas veces por comando.
Medir
GIT_TRACE2_PERF=1 git status
GIT_TRACE2_EVENT=/tmp/trace.json git status
git -c trace2.eventTarget=/tmp/trace git fetch
La caja de herramientas de rendimiento
- commit-graph: datos de alcanzabilidad precomputados.
- filtros Bloom de rutas cambiadas: saltar commits irrelevantes.
- multi-pack-index: un índice de búsqueda a través de muchos packs.
- bitmaps de alcanzabilidad: operaciones de conjunto O(1).
- fsmonitor: notificaciones de cambio del FS.
- partial clone y sparse index.
- repack geométrico.
- protocolo v2: negociación de refs eficiente.
- git maintenance: mantener todo fresco.
Victorias rápidas
git config feature.manyFiles true
git config core.fsmonitor true
git config core.untrackedCache true
git config index.version 4
git maintenance start
Errores comunes
Afinar antes de medir. Habilitar características sin entenderlas. Saltarse git maintenance start.