Close

Git gc

git gc es un comando de mantenimiento del repositorio. "gc" son las iniciales de “garbage collection” (recolección de basura). Ejecutar git gc le dice a Git que limpie todo lo superfluo que ha generado en el repositorio actual. “Recolección de basura“ es un concepto que tiene su origen en los lenguajes de programación interpretados que asignan dinámicamente la memoria. En los lenguajes interpretados, la recolección de basura se usa para recuperar la memoria que se ha vuelto inaccesible para el programa en ejecución.

Los repositorios de Git acumulan diversos tipos de basura; por ejemplo, las confirmaciones huérfanas o inaccesibles. Las confirmaciones de Git pueden volverse inaccesibles cuando se ejecutan comandos que alteran el historial, como git resets o git rebase. Para preservar el historial y evitar la pérdida de datos, Git no elimina las confirmaciones desasociadas. Aunque una confirmación esté desasociada, se puede extraer con checkout, seleccionar con cherry-pick y examinar con git log.

Además de la limpieza de confirmaciones desasociadas, git gc también se encarga de comprimir objetos de Git almacenados para liberar espacio en disco valiosísimo. Cuando Git identifica un grupo de objetos similares, los comprime en un “pack“ (paquete). Los paquetes son como archivos zip de objetos Git y se almacenan en el directorio ./git/objects/pack de un repositorio.


¿Qué hace realmente git gc?


Antes de la ejecución, git gc comprueba varios valores de git config. Estos valores ayudan a aclarar el resto de la responsabilidad de git gc.

Configuración de git gc

gc.reflogExpire

Variable opcional cuyo valor predeterminado es de 90 días. Se usa para establecer cuánto tiempo deben conservarse los registros en un registro de referencias de ramas.

gc.reflogExpireUnreachable

Variable opcional cuyo valor predeterminado es de 30 días. Se usa para establecer cuánto tiempo deben conservarse los registros inaccesibles en un registro de referencias.

gc.aggressiveWindow
bases de datos
Material relacionado

Cómo mover un repositorio de Git completo

Logotipo de Bitbucket
VER LA SOLUCIÓN

Aprende a usar Git con Bitbucket Cloud

Variable opcional cuyo valor predeterminado es 250. Controla cuánto tiempo se dedica a la fase de compresión delta del empaquetado de objetos cuando git gc se ejecuta con la opción --aggressive.

gc.aggressiveDepth

Variable opcional cuyo valor predeterminado es 50. Controla la profundidad de compresión que emplea git-repack durante una ejecución de git gc --aggresive.

gc.pruneExpire

Variable opcional cuyo valor predeterminado es “2 weeks ago” (2 semanas después de que el objeto sea inaccesible). Establece cuánto tiempo se conservará un objeto inaccesible antes de eliminarlo.

gc.worktreePruneExpire

Variable opcional cuyo valor predeterminado es “3 months ago” (hace 3 meses). Establece cuánto tiempo se conservará un árbol de trabajo obsoleto antes de eliminarlo.

Ejecución de git gc

Entre bastidores, git gc ejecuta un conjunto de otros subcomandos internos como git prune, git repack, git pack y git rerere. La responsabilidad general de estos comandos es identificar los objetos de Git que estén fuera de los umbrales establecidos en la configuración de git gc. Una vez identificados, los objetos se comprimen o se eliminan.

Prácticas recomendadas y preguntas frecuentes sobre git gc


La recolección de basura se ejecuta automáticamente en varios comandos de uso frecuente:

La frecuencia con la que se deba ejecutar manualmente git gc dependerá del nivel de actividad en un repositorio. Un repositorio en el que participa un único desarrollador tendrá que ejecutar git gc con mucha menos frecuencia que un repositorio en el que participan varios usuarios y que se actualiza con frecuencia.

Diferencias entre git gc y git prune


git gc es un comando principal y git prune es un comando secundario. git gc desencadena internamente git prune. git prune se usa para eliminar objetos Git que la configuración de git gc ha considerado inaccesibles. Consulta más información sobre git prune.

¿Qué es git gc --aggressive?


git gc se puede invocar con la opción de línea de comandos --aggressive. La opción --aggressive hace que git gc dedique más tiempo al proceso de optimización. Esto hace que git gc tarde más en ejecutarse, pero ahorrará más espacio en disco una vez finalizado. Los efectos de --aggressive son permanentes, y solo debe ejecutarse después de que se hayan realizado muchos cambios en un repositorio.

¿Qué es git gc --auto?


La variante de comando git gc --auto primero comprueba si es necesario algún mantenimiento en el repositorio antes de la ejecución. Si determina que no hace falta mantenimiento, finaliza sin hacer nada más. Algunos comandos de Git ejecutan git gc --auto de forma implícita después de la ejecución para limpiar cualquier objeto suelto que hayan creado.

Antes de la ejecución, git gc --auto comprueba la configuración de git para ver si hay valores que determinen umbrales en cuanto a objetos sueltos y el tamaño de compresión de paquetes. Estos valores se pueden configurar con git config. Si el repositorio supera cualquiera de los umbrales de mantenimiento, se ejecutará git gc --auto.

Primeros pasos con git gc


Probablemente ya estés usando git gc sin darte cuenta. Como vimos en la sección de prácticas recomendadas, se invoca automáticamente mediante comandos de uso frecuente. Si quieres invocarlo manualmente, solo tienes que ejecutar git gc y deberías ver un resultado que indique el trabajo que ha realizado.


Compartir este artículo
Tema siguiente

Lecturas recomendadas

Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.

Gente que colabora utilizando un muro lleno de herramientas

Blog de Bitbucket

Ilustración de Devops

Ruta de aprendizaje de DevOps

Demostraciones de funciones con expertos de Atlassian del Centro de demostraciones

Cómo funciona Bitbucket Cloud con Atlassian Open DevOps

Suscríbete para recibir el boletín de DevOps

Thank you for signing up