Tenemos un repositorio git que contiene código fuente y binarios. El repositorio desnudo ahora ha alcanzado ~ 9GB, y la clonación lleva años. La mayor parte del tiempo se gasta en "control remoto: Compresión de objetos". Después de comprometerse con una nueva versión de uno de los binarios más grandes, una búsqueda lleva mucho tiempo, también pasó la compresión de objetos en el servidor.Reparando un repositorio git que se desacelera debido a los grandes archivos binarios
Después de leer git pull without remotely compressing objects sospecho que la compresión delta de archivos binarios es lo que también nos duele, pero no estoy 100% seguro de cómo solucionarlo.
¿Cuáles son los pasos exactos para arreglar el repositorio desnudo en el servidor? Mi opinión:
- Añadir entradas como '* .zip -delta' para todas las extensiones que quiero en .git/información/atributos
- Run 'git rehacer', pero con qué opciones? ¿Volvería a empaquetar todo y me dejaría un repositorio donde nunca se ha realizado una compresión delta en los tipos de archivos especificados?
- Ejecute 'git prune'. Pensé que esto se hizo automáticamente, pero ejecutarlo cuando jugué con un clon desnudo de dicho repos redujo el tamaño en ~ 2GB
- Cloné el repositorio, agregué y cometí un .gitattributes con las mismas entradas que agregué en .git/info/atributos en el informe vacío
¿Estoy en algo?
Actualización:
Algunos resultados de las pruebas interesantes sobre esto. Hoy comencé un clon desnudo del repositorio problemático. Nuestro servidor no tan poderoso con 4 GB RAM se quedó sin memoria y comenzó a intercambiar. Después de 3 horas, me rendí ...
Luego, en su lugar cloné un repo al desnudo de mi copia de trabajo actualizada. La clonación de esa entre estaciones de trabajo tomó ~ 5 minutos. Luego lo empujé al servidor como un nuevo repositorio. La clonación que repo tomó solo 7 minutos.
Si interpreto esto correctamente, un repo lleno mejor funciona mucho mejor, incluso sin deshabilitar la compresión delta para archivos binarios. Supongo que esto significa que los pasos anteriores son, de hecho, lo que quiero hacer a corto plazo, pero además necesito saber cómo limitar la cantidad de memoria que se permite usar git para empaquetar/comprimir en el servidor, así puedo evitar el intercambio.
En caso de que importe: el servidor ejecuta git 1.7.0.4 y las estaciones de trabajo ejecutan 1.7.9.5.
Actualización 2:
hice los siguientes pasos en mi TestRepo, y creo que lo haga la oportunidad de hacerlo en el servidor (después de una copia de seguridad)
uso de la memoria límite cuando el embalaje objetos
git config pack.windowMemory 100m
paquete git config.packSizeLimit 200mcompresión delta Desactivar para algunas extensiones
eco '* .tar.gz -delta' >> información/atributos
echo '* Tar.bz2 -delta' >> info/atributos
echo '* .bin -delta' >> información/atributos
echo '* .png -delta' >> información/atributosrepositorio de volver y recoger la basura
git embalar -a -d -F --window memoria 100m --max paquete de tamaño 200m
git gc
Actualización 3:
Algunos efectos secundarios inesperados después de esta operación: Issues after trying to repack a git repo for improved performance
¿Sería una alternativa el almacenamiento de los binarios en otro lugar? Git realmente apesta con grandes binarios, lo que ha sido reconocido. Es por eso que hay [por separado] (http://caca.zoy.org/wiki/git-bigfiles) [productos] (http://git-annex.branchable.com/) para eso ... – eis
Cuando comenzamos con git agregamos uC-binaries, nuestro rootfs y toolchain, para poder obtener una instantánea completa del pasado con solo revisar una revisión de git. No sabíamos lo suficiente sobre git para prever la lentitud. Planeo arreglar esto correctamente (he estado viendo git-annex, pero no sabía acerca de git-bigfiles), pero como solución a corto plazo, me gustaría mejorar el rendimiento del repositorio actual lo mejor que pueda. – anr78
Creo que es una buena práctica almacenar su entorno de desarrollo/cadena de herramientas en una máquina virtual (si usted debe almacenar absolutamente diferentes versiones de su entorno de desarrollo, simplemente almacene una nueva imagen de disco fuera de su repositorio). –