¿Hay alguna forma de limitar la cantidad de memoria que usa "git gc"?


Estoy alojando un repositorio git en un host compartido. Mi repositorio necesariamente tiene un par de archivos muy grandes en él, y cada vez que intento ejecutar "git gc" en el repositorio ahora, mi proceso es asesinado por el proveedor de alojamiento compartido por usar demasiada memoria. ¿Hay alguna manera de limitar la cantidad de memoria que git gc puede consumir? Mi esperanza sería que puede cambiar el uso de memoria para la velocidad y solo tomar un poco más de tiempo para hacer su trabajo.

Author: Andrew Grimm, 2010-06-22

5 answers

Sí, echa un vistazo a la página de ayuda para git config y mira las opciones pack.*, específicamente pack.depth, pack.window, pack.windowMemory y pack.deltaCacheSize.

No es un tamaño totalmente exacto, ya que git necesita mapear cada objeto en la memoria, por lo que un objeto muy grande puede causar un gran uso de memoria, independientemente de la configuración de la ventana y la caché delta.

Es posible que tenga mejor suerte empaquetando localmente y transfiriendo archivos de paquete al lado remoto "manualmente", agregando archivos .keep para que el git remoto nunca intente vuelve a empacar todo por completo.

 14
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-22 18:05:04

Usé instrucciones de este enlace. La misma idea que sugirió Charles Baileys .

Una copia de los comandos está aquí:

git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"
git config --global pack.threads "1"

Esto funcionó para mí en hostgator con una cuenta de alojamiento compartido.

 31
Author: hopeithelps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:22

El uso de memoria de Git repack es: (pack.deltaCacheSize + pack.windowMemory) × pack.threads. Los valores predeterminados respectivos son 256MiB, unlimited, nproc.

La caché delta no es útil: la mayor parte del tiempo se gasta computando deltas en una ventana deslizante, la mayoría de las cuales se descartan; el almacenamiento en caché de los sobrevivientes para que puedan ser reutilizados una vez (al escribir) no mejorará el tiempo de ejecución. Esa caché tampoco se comparte entre subprocesos.

De forma predeterminada, la memoria de la ventana está limitada a pack.window (gc.aggressiveWindow). Limitar el embalaje de esa manera es una mala idea, porque el tamaño y la eficiencia del conjunto de trabajo variarán ampliamente. Es mejor elevar ambos valores a valores mucho más altos y confiar en pack.windowMemory para limitar el tamaño de la ventana.

Finalmente, el enhebrado tiene la desventaja de dividir el conjunto de trabajo. Bajar pack.threads y aumentar pack.windowMemory para que el total permanezca igual debería mejorar el tiempo de ejecución.

Repack tiene otros sintonizadores útiles(pack.depth, pack.compression, las opciones de mapa de bits), pero no afectan el uso de la memoria.

 9
Author: Tobu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 13:17:37

Puede usar desactivar el atributo delta para deshabilitar la compresión delta solo para los blobs de esos nombres de ruta:

In foo/.git/info/attributes (or foo.git/info/attributes if it is a bare repository) (see the delta entry in gitattributes and see gitignore for the pattern syntax):

/large_file_dir/* -delta
*.psd -delta
/data/*.iso -delta
/some/big/file -delta
another/file/that/is/large -delta

Esto no afectará a los clones del repositorio. Para afectar a otros repositorios (es decir, clones), coloque los atributos en un archivo .gitattributes en lugar de (o además de) el archivo info/attributes.

 6
Author: Chris Johnsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-22 20:00:05

Git 2.18 (Q2 2018) mejorará el consumo de memoria gc.
Antes de 2.18, "git pack-objects "necesita asignar toneladas de" struct object_entry " mientras hace su trabajo: reducir su tamaño ayuda al rendimiento bastante .
Esto influye git gc.

Véase commit f6a5576, commit 3b13a5f, commit 0aca34e, commit ac77d0c, commit 27a7d06, commit 660b373, commit 0cb3c14, commit 898eba5, commit 43fa44f, commit 06af3bb, commit b5c0cbd, commit 0c6804a, commit fd9b1ba, commit 8d6ccce, commit 4c2db93 (14 Abr 2018) by NguynN Thái Ng DuC Duy (pclouds).
(Merged by Junio C Hamano -- gitster -- in commit ad635e8 , 23 May 2018)

pack-objects: reordenar miembros para reducir struct object_entry

Los parches anteriores dejan muchos agujeros y relleno en este struct.
Este parche reordena los miembros y reduce la estructura a 80 bytes (a partir de 136 bytes en sistemas de 64 bits, antes de que se realice cualquier reducción de campo) con 16 bits de sobra (y un par más en in_pack_header_size cuando realmente nos quedamos sin bits).

Este es el último de una serie de parches de reducción de memoria (ver "pack-objects: a bit of document about struct object_entry " for the el primero).

En general, han reducido el tamaño de la memoria de repack el linux-2.6.git de 3.747 G a 3.424 G, o en torno a 320 M, una disminución del 8,5%.
El tiempo de ejecución de repack se ha mantenido igual a lo largo de esta serie.
Las pruebas de Ævar en un gran monorepo al que tiene acceso (más grande que linux-2.6.git) han mostrado una reducción del 7,9%, por lo que la mejora general esperada debe ser alrededor del 8%.


Con Git 2.20 (Q4 2018), será más fácil comprobar que un objeto que existe en una bifurcación no se convierte en un delta contra otro objeto que no lo hace aparecen en el mismo repositorio bifurcado.

Véase commit fe0ac2f, commit 108f530, commit f64ba53 (16 Ago 2018) por Christian Couder (chriscool).
Ayuda-por: Jeff King (peff), and Duy Nguyen (pclouds).
Véase commit 9eb0986, commit 16d75fa, commit 28b8a73, commit c8d521f (16 Ago 2018) por Jeff King (peff).
Ayuda-por: Jeff King (peff), and Duy Nguyen (pclouds).
(Merged by Junio C Hamano -- gitster -- in commit f3504ea , 17 Sep 2018)

pack-objects: mover 'layer ' a 'struct packing_data'

Esto reduce el tamaño de 'struct object_entry' de 88 bytes a 80 y por lo tanto hace que empaquetar objetos sea más eficiente.

Por ejemplo, en un repositorio de Linux con objetos de 12M, git pack-objects --all necesita memoria adicional de 96MB incluso si la entidad de capa no utilizar.

 0
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-22 16:25:46