El comando git gc se usa para mantener un repositorio. La recolección de basura se denota con «gc». Git gc es un comando que le dice a Git que limpie el desorden que ha creado en el repositorio existente. La recolección de basura es un concepto que proviene de la asignación dinámica de memoria en lenguajes de programación interpretados. En un lenguaje de programación, la recolección de elementos no utilizados se realiza para recuperar una memoria que no ha estado disponible para la gestión del personal. Ejecuta una serie de actividades de mantenimiento dentro del repositorio actual, como eliminar objetos inalcanzables generados por las llamadas de git add anteriores, comprimir revisiones de archivos (para ahorrar espacio en disco y mejorar el rendimiento), podar reflog, rerere metadatos, eliminar árboles de trabajo antiguos y empaquetar referencias También es posible cambiar índices complementarios como el gráfico de confirmación.
El uso manual de git gc solo se puede usar si necesita agregar elementos a un repositorio sin ejecutar comandos de porcelana de forma rutinaria, realizar una optimización del repositorio por única vez o limpiar una importación masiva subóptima. Por ejemplo, varios tipos de basura o basura se acumulan en los repositorios de Git. Las confirmaciones huérfanas o no disponibles constituyen la mayor parte de la basura de Git. Cuando se usan comandos en segundo plano como git resets o git rebase, las confirmaciones de git pueden dejar de estar disponibles. Git no descartará las confirmaciones separadas para mantener el historial y proteger los datos. Una confirmación separada aún se puede ver en el registro de git, seleccionar e inspeccionar.
Siempre que se ejecuten actividades comunes que generan objetos, comprobarán si el repositorio ha crecido mucho desde el último mantenimiento y, en caso afirmativo, ejecutarán automáticamente git gc.
git gc ejecutará la compresión en los objetos Git guardados además de la limpieza de confirmación separada, para liberar espacio valioso en el disco. Git comprimirá un montón de objetos relacionados en un ‘paquete’ cuando los detecte. Los paquetes son archivos zip del proyecto Git que residen en el directorio «./git/objects/pack de un repositorio».
Git gc verifica numerosas configuraciones de configuración de git antes de ejecutarse. Estos valores ayudarán a comprender el resto de las responsabilidades de git gc.
Configuración de Git gc:
gc.reflogExpire
Esta es una variable opcional con un valor predeterminado de 90 días. Se utiliza para especificar el período de tiempo que se deben conservar los registros en el registro de referencia de una sucursal.
gc.reflogExpireUnreachable
Esta es una variable opcional con un valor predeterminado de 30 días. Se utiliza para especificar la cantidad de tiempo que deben conservarse los registros de reflog inaccesibles.
gc.aggressiveWindow
Esta es una variable opcional con un valor predeterminado de 250. Cuando git gc se ejecuta con la opción —agresiva, determina cuánto tiempo se dedica a la fase de compresión delta del empaquetado de objetos. Debido a que esto puede demorar más de lo esperado, los impactos del comando asertivo suelen ser duraderos.
gc.aggressiveDepth
Variable opcional con un valor de 50 por defecto. Especifica la profundidad de compresión utilizada por git-repack durante un comando git gc —aggressive.
gc.pruneExpire
Esta configuración es opcional y el valor predeterminado es «Hace 2 semanas». Determina cuánto tiempo se mantendrá un elemento inaccesible antes de ser podado.
gc.worktreePruneExpire
Esta configuración es opcional y el valor predeterminado es «Hace 3 meses». Especifica la cantidad de tiempo que se mantendrá un árbol en funcionamiento obsoleto antes de eliminarlo.
git gc exec:
Git gc realmente ejecuta un montón de diferentes subcomandos privados como git prune, git repack, git pack y git reference detrás de escena. La mayor responsabilidad de estos comandos es encontrar cualquier elemento de Git que esté fuera de los límites estándar de la configuración de git gc. Luego, estos elementos se comprimen o recortan según sea necesario una vez que se han localizado.
¿Cuál es el significado de git gc agresivo?
El símbolo del sistema –agresivo se puede usar para ejecutar git gc. La opción –agresiva le dice a git gc que se esfuerce más en optimizar el código. Esto hace que git gc se ejecute más lento, pero ahorra más espacio en disco una vez que finaliza. Las consecuencias de –aggressive son duraderas, por lo tanto, solo es necesario usarlo después de que se hayan realizado una cantidad sustancial de modificaciones en un repositorio.
¿En qué se diferencia git prune de git gc?
git gc es un comando principal y git prune es un comando secundario. Esencialmente, git prune será activado por git gc. Git prune se usa para eliminar objetos de Git que la configuración de git gc ha considerado inalcanzables. Obtén más información sobre el comando git prune.
¿Cuál es el significado de git gc auto?
Antes de ejecutar, la variante de comando git gc–auto verifica si se necesita algún mantenimiento en el repositorio. Sale sin siquiera hacer el trabajo si determina que no se requiere limpieza. Después de la ejecución, varias tareas de Git ejecutan git gc–auto para eliminar cualquier elemento suelto que hayan producido. Git gc –auto verifica la configuración de git para los niveles de umbral en objetos libres y el tamaño de compresión del empaque antes de ejecutar. git config se puede usar para establecer estos valores. Git gc–auto se ejecutará si el repositorio supera alguno de los umbrales de limpieza.
opciones de git gc
$ cd gc --aggressive
El comando git gc generalmente tiene una velocidad de ejecución rápida, así como una eficiencia de espacio en disco impecable y el rendimiento deseado. Como resultado, el comando agresivo mejorará la eficiencia de la memoria y ralentizará la ejecución. Debido a que esto puede demorar más de lo esperado, los impactos del comando asertivo suelen ser duraderos.
$ cd gc --auto
Puede utilizar esta opción para determinar si se requiere o no un almacén. Simplemente se muda si no lo necesita. Cuando se usan variables de configuración como gc.auto o gc.autoPackLimit junto con el comando git auto, el mecanismo de limpieza se activa automáticamente.
$ cd gc --prune=<date>
El comando podar es idéntico a este. El objetivo principal de este comando es eliminar o seguir perdiendo el control de las cosas que se han especificado en una fecha específica. Simplemente muestra los objetos más antiguos que estaban presentes en un momento determinado. Como resultado, si se ejecuta otra operación en el repositorio al mismo tiempo, aumentan el envejecimiento y el peligro de corrupción.
$ cd gc --no-prune
Este comando simplemente elimina todos los objetos faltantes del repositorio.
$ cd gc --quite
Este comando se utiliza para eliminar todos los informes de progreso anteriores.
$ cd gc --force
A pesar de que se puede estar ejecutando otro comando git gc en el repositorio, este comando se utiliza para ejecutar el comando actual. Tiene prioridad sobre el comando git gc que se ejecutaba anteriormente y lo ejecuta.
$ cd gc --keep-largest-pack
Como se indicó anteriormente, el comando pack combina todos los elementos en un solo paquete. Como resultado, cuando ejecuta el comando anterior, todos los datos relacionados se comprimen en un paquete, con la excepción del paquete más grande. Durante la ejecución de este comando, el paquete gc.bigPackThreshold simplemente se ignora.
Podemos concluir que Git gc tiene dificultades para eliminar cualquier objeto de referencia del repositorio. Como resultado, el índice conserva los objetos de referencia a partir de ramas y etiquetas, lo que permite el seguimiento remoto de ramas o confirmaciones que se han rebobinado o alterado. Es crucial recordar que las referencias no mantienen vivos los objetos. Si espera eliminar algunos objetos, debe inspeccionar todas sus ubicaciones y determinar si la eliminación tiene sentido o no antes de eliminar esas referencias.
Además, al usar el comando git gc con muchos procesos operando al mismo tiempo, existe el riesgo de eliminar una función que aún no ha generado su referencia. Si el otro proceso está íntimamente acoplado con el proceso ejecutable simultáneamente, también puede fallar como resultado. Git tiene dos características que ayudan a resolver este problema.
Los siguientes son los dos atributos de la siguiente manera:
- Si Git descubre que se está haciendo referencia a un objeto más nuevo o que se puede acceder a él, lo conserva.
- Siempre que exista la alteración del intervalo de tiempo, se tendrá en cuenta el procedimiento anterior. Sin embargo, debido a que la función no es parte de la solución completa, los usuarios prefieren no utilizarla en la práctica debido a la posibilidad de corrupción.