El pago del depósito del enorme Git en el gancho post-recepción es extremadamente lento

Estamos usando Git para nuestro proyecto. El repository es bastante grande (la carpeta .git es de aproximadamente 8 Gb).

Estamos utilizando "git checkout -f" en el gancho post-recepción para actualizar el tree de trabajo.

El problema es que revisar incluso un par de files ligeramente modificados lleva demasiado time, aproximadamente 20 segundos. No tengo idea de por qué es tan largo.

¿Puede ser ese el problema del tamaño del repository?

¿Qué pasos o herramientas debo tratar de localizar e investigar más el problema?

Gracias por cualquier ayuda.

Saludos, Alex

Respuesta original (noviembre de 2012)

Confirmo que git se ralentizará considerablemente si mantienes un directory de git ( .git ) tan grande.

Puede ver una ilustración en este hilo (no a causa de files grandes, sino por la gran cantidad de files y el historial de compromisos):

El informe de testing tiene 4 millones de confirmaciones, historial lineal y aproximadamente 1,3 millones de files.
El tamaño del directory .git es de aproximadamente 15 GB y se ha reempaquetado con '

 git repack -a -d -f --max-pack-size=10g --depth=100 --window=250 

Este reempaquetado tardó aproximadamente 2 días en una máquina fornida (es decir, muchos pistones y flash).
El tamaño del file de índice es de 191 MB.

Por lo less, podría considerar dividir el repository, aislar los binarys en su propio repository de git y usar submodules para hacer un seguimiento entre los repositorys de origen y binarys.

Lo mejor es almacenar grandes files binarys (especialmente si se generan) fuera de un referencel de origen .
Se recomienda un repository "artefacto", como Nexus .

La solución completa que aparece al mantener esos binarys es git-annex o git-media, como se presenta en " ¿Cómo manejar un gran repository de git? ".


Actualización de febrero de 2016: git 2.8 (marzo de 2016) debería mejorar significativamente el performance de git checkout .

Consulte commit a672095 (22 de enero de 2016) y commit d9c2bd5 (21 de diciembre de 2015) por David Turner ( dturner-tw ) .
(Fusionado por Junio ​​C Hamano – gitster – en commit 201155c , 03 Feb 2016)

unpack-trees : arreglar accidentalmente el comportamiento cuadrático

Al desempacar los treees (por ejemplo, durante el process de git checkout ), cuando pulsamos una input de caching pasada y fuera de nuestro path, cortamos la iteración.

Esto proporciona aproximadamente un 45% de aceleración en el pago de git entre master y master^20000 en el monorepo de Twitter .
La aceleración en general dependerá de la estructura de repository, la cantidad de cambios y las decisiones de embalaje del package.

do_compare_entry : utiliza una ruta ya calculada

En traverse_trees, generamos la ruta transversal completa para un traverse_info .
Más tarde, en do_compare_entry, solíamos hacer un montón de trabajo para comparar el traverse_info con el nombre de un cache_entry sin calcular esa ruta.
Pero como ya tenemos ese path, no necesitamos hacer todo ese trabajo.
En cambio, podemos simplemente poner la ruta generada en traverse_info , y hacer la comparación más directamente.

Esto hace que git checkout mucho más rápido: alnetworkingedor del 25% en el monorepo de Twitter. Es probable que los treees de directorys más profundos se beneficien más que los less profundos .