Por Anónimo (no verificado) , 29 Abril 2026

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 status recorre el árbol de trabajo para detectar cambios.
  • git log, git blame y cálculos de merge-base recorren grafos de commits.
  • git fetch negocia con el servidor sobre muchos cambios de ref.
  • git gc repacka 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.