Acelera Git: Técnicas Esenciales de Optimización de Rendimiento
Acelera Git reduciendo el costo de clonación, usando Git LFS con prudencia, podando referencias obsoletas, ignorando archivos generados y aplicando checkout disperso.
Acelera Git: Técnicas Esenciales de Optimización de Rendimiento
Git lento generalmente tiene una causa concreta: demasiado historial, demasiados archivos no rastreados, objetos binarios grandes, escaneos costosos del sistema de archivos o latencia de red. Antes de culpar a Git, verifica qué operación es lenta y qué está intentando leer o descargar.
La optimización del rendimiento de Git funciona mejor cuando emparejas la solución con el síntoma. Un clon lento en CI necesita una respuesta diferente a un git status lento en un árbol de trabajo enorme.
Comprendiendo las Causas del Rendimiento Lento de Git
Comienza con las causas comunes:
- Un historial largo con muchos archivos y referencias.
- Archivos binarios grandes comprometidos directamente en Git.
- Salidas de compilación, carpetas de dependencias o registros sin ignorar en el árbol de trabajo.
- Muchas ramas de seguimiento remoto y etiquetas obsoletas.
- Enlaces de red lentos hacia el remoto.
- Versiones antiguas de Git que carecen de mejoras modernas de mantenimiento y checkout disperso.
Ejecuta el comando lento con intención. Si git clone es lento, mira el tamaño del historial y la transferencia de red. Si git status es lento, mira el tamaño del árbol de trabajo, los archivos ignorados y el comportamiento del sistema de archivos. Si git fetch es lento, mira las referencias remotas, etiquetas y objetos cambiados.
Reduce el Costo de Clonación y Fetch
Para CI, trabajos de despliegue e inspección de solo lectura, a menudo no necesitas el historial completo.
Usa un clon superficial:
git clone --depth <número> <url_del_repositorio>
Por ejemplo, para clonar solo los últimos 10 commits:
git clone --depth 10 https://github.com/ejemplo/repo.git
Para trabajos de CI que solo compilan el commit actual, --depth 1 suele ser suficiente. Para trabajo de desarrollador, un clon completo suele ser menos sorprendente porque comandos como git log profundo, checkout de etiquetas antiguas y algunos rebases necesitan más historial.
Si ya tienes un clon superficial y necesitas más historial, profundízalo:
git fetch --deepen=50 origin
O conviértelo en un clon completo:
git fetch --unshallow origin
Para necesidades de datos parciales, las versiones más nuevas de Git también admiten filtros de clon parcial como --filter=blob:none, pero úsalos solo cuando tu host de Git y flujo de trabajo los soporten bien:
git clone --filter=blob:none https://github.com/ejemplo/repo-grande.git
Mantén los Archivos Grandes Fuera del Historial Normal de Git
Los binarios grandes son una de las formas más rápidas de hacer que Git se sienta lento. Las imágenes, videos, archivos, archivos de diseño y archivos de modelo a menudo no se comprimen ni diferencian bien.
Usa Git LFS para activos grandes que realmente pertenecen al repositorio:
git lfs install
git lfs track "*.psd"
git lfs track "assets/*.mp4"
git add .gitattributes
git commit -m "Rastrear activos grandes con Git LFS"
Git LFS afecta los commits futuros después de que las reglas de seguimiento estén en su lugar. Si alguien ya comprometió archivos grandes en el historial normal de Git, eliminar del árbol actual no es suficiente. Puede que necesites una reescritura coordinada del historial con una herramienta como git lfs migrate import o git filter-repo.
Para artefactos de compilación generados, la mejor respuesta generalmente no es LFS. No los comprometas. En su lugar, agrégalos a .gitignore:
node_modules/
dist/
coverage/
*.log
Limpia Referencias y Objetos Locales
Las ramas de seguimiento remoto obsoletas añaden desorden y pueden ralentizar comandos que listan o inspeccionan referencias. Pódalas durante el fetch:
git fetch --prune
Elimina ramas locales que ya están fusionadas y ya no son necesarias:
git branch --merged
git branch -d rama-funcionalidad-antigua
Deja que Git ejecute mantenimiento:
git maintenance run
En flujos de trabajo más antiguos, git gc sigue siendo útil:
git gc
Evita comandos de limpieza agresivos a menos que sepas por qué los necesitas. Por ejemplo, expirar reflogs puede dificultar la recuperación de un mal reset.
Haz que git status Sea Más Barato
git status tiene que inspeccionar el árbol de trabajo. Si tu directorio de proyecto contiene miles de archivos generados o de dependencias, el estado puede volverse ruidoso y lento.
Usa .gitignore para archivos que Git no debe considerar. Si un archivo ya está rastreado, .gitignore no impedirá que Git lo rastree; debes eliminarlo del índice primero:
git rm --cached ruta/al/archivo-generado
Para repositorios muy grandes donde solo necesitas parte del árbol, el checkout disperso puede ayudar:
git sparse-checkout init --cone
git sparse-checkout set servicios/api docs
Eso mantiene solo las rutas seleccionadas en tu árbol de trabajo. Es útil en monorepos, pero tu equipo debe documentar las rutas dispersas esperadas para que los desarrolladores no se pierdan archivos que necesitan.
Separa Fetch de Integración
git pull obtiene y luego integra cambios con merge o rebase, dependiendo de la configuración. Cuando un repositorio es grande o una rama ha divergido, a menudo es más claro hacer fetch primero:
git fetch origin
git log --oneline HEAD..origin/main
git merge origin/main
Esto no hace que la transferencia de red sea más pequeña por sí mismo. Te da control antes de cambiar tu rama de trabajo.
Conclusión Práctica
Usa clones superficiales para trabajos de corta duración, Git LFS para activos grandes, .gitignore para archivos generados, poda para referencias obsoletas y checkout disperso para árboles grandes donde solo necesitas un subconjunto. Mantén Git actualizado, pero no uses herramientas de integridad como git fsck como una solución de rendimiento a menos que sospeches corrupción del repositorio.
Cuando Git se sienta lento, anota el comando exacto y dónde se va el tiempo: transferencia de red, procesamiento de objetos o escaneo del árbol de trabajo. Ese detalle generalmente apunta a la optimización correcta.