2010-06-22 18 views
26

Estoy organizando un git repo en un host compartido. Mi informe necesariamente tiene un par de archivos muy grandes, y cada vez que trato de ejecutar "git gc" en el repositorio ahora, el proveedor de alojamiento compartido mata mi proceso por usar demasiada memoria. ¿Hay alguna manera de limitar la cantidad de memoria que git gc puede consumir? Mi esperanza es que pueda cambiar el uso de la memoria por velocidad y solo demore un poco más en hacer su trabajo.¿Hay alguna manera de limitar la cantidad de memoria que usa "git gc"?

+1

postimum relacionado: http://stackoverflow.com/a/10293304/274502 – cregox

+0

Sí, tenía un problema similar en Dreamhost (con el que está etiquetada esta pregunta). No hay tantos casos en los que se haya matado a 'git', pero' darcs' (otro VCS) siempre se mata, por lo que no se puede usar en http://Dreamhost.com –

Respuesta

14

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

No es un tamaño totalmente exacto ya que git necesita asignar cada objeto a la memoria para que un objeto muy grande pueda causar una gran cantidad de memoria independientemente de la configuración de ventana y delta cache.

Puede tener mejor suerte empacando localmente y transfiriendo los archivos del paquete al lado remoto "manualmente", agregando un archivo .keep para que el git remoto nunca intente volver a empaquetar todo.

5

Usted podría utilizar apagar el atributo delta para desactivar la compresión delta para sólo las manchas de los nombres de ruta:

En foo/.git/info/attributes (o foo.git/info/attributes si se trata de un repositorio desnudo) (ver la entrada de delta en gitattributes y ver gitignore para la sintaxis del patrón):

/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.

+0

Esta es la respuesta más útil cuando se trata de archivos de gran tamaño. Gracias. Tengo un repo de algunos PSD, y solía tomar gigabytes de memoria para hacer un git gc, ahora toma menos de 100MB de RAM. Guay. –

30

Utilicé las instrucciones de este link. Se sugirió la misma idea que 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 cuenta de alojamiento compartido.

+2

Gracias! Esto funciona para mí, pero creo que hay un error tipográfico en la segunda línea: no hay una opción SizeLimit; debería leer: git config --global pack.packSizeLimit "100m" – Max

+1

Esto funcionó perfectamente. Si no funciona al principio, pruebe con un límite inferior en windowMemory y packSizeLimit. En mi caso, 25m fue el punto dulce. – jsapara

+0

Cambié el nombre de la opción. El enlace original está roto, no estoy seguro de dónde apuntarlo. – phunehehe

8

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

La memoria caché delta no es útil: la mayor parte del tiempo se utiliza para calcular deltas en una ventana deslizante, la mayoría de las cuales se descartan; el almacenamiento en caché de los supervivientes para que puedan volver a utilizarse una vez (al escribir) no mejorará el tiempo de ejecución. Ese caché tampoco se comparte entre subprocesos.

De forma predeterminada, la memoria de la ventana está limitada a través de pack.window (gc.aggressiveWindow). Limitar el empaque de esa manera es una mala idea, porque el tamaño y la eficiencia del conjunto de trabajo variarán ampliamente. Lo mejor es elevar ambos 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.

reempaquetado tiene otros parámetros optimizables útiles (pack.depth, pack.compression, las opciones de mapa de bits), pero no afectan el uso de la memoria.

+0

¿No parece la verdad completa? ¿Tiene una idea: http://stackoverflow.com/questions/42175296/git-gc-uses-a-lot-of-memory-even-i-limited-it – Alex

Cuestiones relacionadas