Tengo un repositorio de 10 GB en una máquina Linux que está en NFS. La primera vez git statusdura 36 minutos y la siguiente git status8 minutos. Parece que Git depende del sistema operativo para almacenar archivos en caché. Solo los primeros gitcomandos como commit, statusque implican empaquetar / reempaquetar todo el repositorio, requieren mucho tiempo para un repositorio enorme. No estoy seguro de si lo ha utilizado git statusen un repositorio tan grande, pero ¿alguien se ha encontrado con este problema?
He tratado git gc, git clean, git repackpero el tiempo que se tarda es todavía / casi lo mismo.
¿Ayudarán los submódulos o cualquier otro concepto como dividir el repositorio en otros más pequeños? Si es así, ¿cuál es la mejor opción para dividir un repositorio más grande? ¿Hay alguna otra forma de mejorar el tiempo necesario para los comandos git en un repositorio grande?
fuente

Respuestas:
Para ser más precisos, git depende de la eficiencia de la
lstat(2)llamada al sistema, por lo que ajustar el “tiempo de espera de la caché de atributos” de su cliente podría ser suficiente.El manual para
git-update-index, esencialmente un modo manual paragit-status, describe lo que puede hacer para aliviar esto, utilizando la--assume-unchangedbandera para suprimir su comportamiento normal y actualizar manualmente las rutas que ha cambiado. Incluso puede programar su editor para que desactive este indicador cada vez que guarde un archivo.La alternativa, como sugiere, es reducir el tamaño de su pago (el tamaño de los archivos de paquete no entra en juego aquí). Las opciones son un pago escaso, submódulos o la herramienta de repositorio de Google .
(Hay un hilo de la lista de correo sobre el uso de Git con NFS , pero no responde a muchas preguntas).
fuente
core.preloadindexen verdadero; consulta losgit-configdocumentos para obtener una descripción más detallada. (Mi lugar de trabajo usa NFS y me encontré exactamente con este problema, pero nunca noté la configuración de preloadindex. ¡Gracias por indicarme el camino correcto!)core.preloadindexLa bandera se establece en verdadero de forma predeterminada a partir de Git 2.1.0: git.kernel.org/pub/scm/git/git.git/tree/Documentation/RelNotes/…También veo este problema en un gran proyecto compartido a través de NFS.
Me tomó algo de tiempo descubrir el flag -uno que se puede asignar tanto a git commit como a git status.
Lo que hace esta bandera es deshabilitar la búsqueda de archivos sin seguimiento. Esto reduce significativamente el número de operaciones nfs. La razón es que para que git descubra archivos sin seguimiento, tiene que buscar en todos los subdirectorios, por lo que si tiene muchos subdirectorios, esto lo perjudicará. Al deshabilitar a git para que no busque archivos sin seguimiento, eliminas todas estas operaciones NFS.
Combine esto con el indicador core.preloadindex y puede obtener un rendimiento razonable incluso en NFS.
fuente
status.showUntrackedFilesarchivo config.Prueba git gc . Además, git clean puede ayudar.
ACTUALIZACIÓN : no estoy seguro de dónde vino el voto en contra, pero el manual de git establece específicamente:
¡Siempre noto una diferencia después de ejecutar git gc cuando el estado de git es lento!
ACTUALIZACIÓN II : no estoy seguro de cómo me perdí esto, pero el OP ya lo intentó
git gcygit clean. Juro que originalmente no estaba allí, pero no veo ningún cambio en las ediciones. ¡Lo siento por eso!fuente
git gcreduzca el tiempo degit logejecución de 15 segundos a 0 en uno de mis repositorios.Si su repositorio de git hace un uso intensivo de submódulos, puede acelerar enormemente el rendimiento del estado de git editando el archivo de configuración en el directorio .git y configurando
ignore = dirtylos submódulos particularmente grandes / pesados. Por ejemplo:Perderá la conveniencia de un recordatorio de que hay cambios sin etapas en cualquiera de los submódulos que puede haber olvidado, pero aún conservará la conveniencia principal de saber cuándo los submódulos no están sincronizados con el repositorio principal. Además, aún puede cambiar su directorio de trabajo al submódulo mismo y usar git status dentro de él como de costumbre para ver más información. Consulte esta pregunta para obtener más detalles sobre lo que significa "sucio".
fuente
El rendimiento del estado de git debería mejorar con Git 2.13 (segundo trimestre de 2017).
Consulte la confirmación 950a234 (14 de abril de 2017) de Jeff Hostetler (
jeffhostetler) .(Combinado por Junio C Hamano -
gitster- en el compromiso 8b6bba6 , 24 de abril de 2017)>
string-list: useALLOC_GROWmacro al reasignarstring_listAdemás, Git 2.17 (Q2 2018) introducirá un nuevo rastreo, para medir dónde se pasa el tiempo en las operaciones con muchos índices.
Consulte la confirmación ca54d9b (27 de enero de 2018) de Nguyễn Thái Ngọc Duy (
pclouds) .(Combinado por Junio C Hamano -
gitster- en el compromiso 090dbea , 15 de febrero de 2018)El mismo Git 2.17 (Q2 2018) mejora
git statuscon:confirmar f39a757 , confirmar 3ca1897 , confirmar fd9b544 , confirmar d7d1b49 (09 de enero de 2018) por Jeff Hostetler (
jeffhostetler) .(Combinado por Junio C Hamano -
gitster- en la confirmación 4094e47 , 08 de marzo de 2018)"
git status" puede pasar muchos ciclos para calcular la relación entre la rama actual y su corriente arriba, que ahora se puede desactivar con la--no-ahead-behindopción " ".commit ebbed3b (25 de febrero de 2018) por Derrick Stolee (
derrickstolee) .Git 2.24 (Q3 2019) propone otra configuración para mejorar el
git statusrendimiento:Consulte confirmar aaf633c , confirmar c6cc4c5 , confirmar ad0fb65 , confirmar 31b1de6 , confirmar b068d9a , confirmar 7211b9e (13 de agosto de 2019) por Derrick Stolee (
derrickstolee) .(Combinado por Junio C Hamano -
gitster- en commit f4f8dfe , 09 de septiembre de 2019)Pero:
Con Git 2.24 (Q4 2019), la ruta de código que lee la
index.versionconfiguración se rompió con una actualización reciente, que se ha corregido.Consulte la confirmación c11e996 (23 de octubre de 2019) de Derrick Stolee (
derrickstolee) .(Combinado por Junio C Hamano -
gitster- en el compromiso 4d6fb2b , 24 de octubre de 2019)fuente
index.threadsconfiguración de configuracióngit config --global core.preloadIndex trueHizo el trabajo por mí. Consulta la documentación oficial aquí .
fuente
2.7.4. Utilizo Linux Subsystem para Windows e incluso actualizadoapt-getparece tener referencias a paquetes bastante antiguos.En nuestro código base donde tenemos en algún lugar en el rango de 20 a 30 submódulos,
git status --ignore-submodulesaceleró drásticamente las cosas. Tenga en cuenta que esto no informará sobre el estado de los submódulos .
fuente
Algo que no se ha mencionado todavía es activar el caché del sistema de archivos en máquinas con Windows (los sistemas de archivos de Linux son completamente diferentes y git fue optimizado para ellos, por lo que probablemente esto solo ayude en Windows).
Como último recurso, si git sigue siendo lento, se podría desactivar la inspección del tiempo de modificación, que git necesita averiguar qué archivos han cambiado.
PERO: Los archivos modificados deben ser agregados posteriormente por el desarrollador con
git add. Git no encuentra cambios por sí mismo.fuente
fuente
index.lockArchivos sobrantesgit statuspuede ser patológicamente lento cuando tieneindex.lockarchivos sobrantes .Esto sucede especialmente cuando lo tiene
git submodules, porque entonces a menudo no nota los archivos sobrantes.Resumen: Ejecute
find .git/ -name index.locky elimine los archivos sobrantes después de comprobar que ningún programa que se esté ejecutando actualmente los esté utilizando.Detalles
Descubrí que el estado de mi shell git era extremadamente lento en mi repositorio, con git 2.19 en Ubuntu 16.04.
Cavé y encontré que
/usr/bin/time git statusen miassetssubmódulo git tomó 1.7 segundos.Encontrado con
straceese git, leyó todos mis archivos grandes allí conmmap. No suele hacer eso, normalmentestates suficiente.Busqué en Google el problema y encontré el problema Uso del índice y Racy Git .
Intenté
git update-index somefile(en mi casogitignoreen el pago del submódulo) que se muestra aquí pero falló conEste es un error clásico. Por lo general, lo nota en cualquier operación de git, pero para los submódulos con los que no se compromete a menudo, es posible que no lo note durante meses, porque solo aparece al agregar algo al índice; la advertencia no se genera en modo de solo lectura
git status.Eliminar el
index.lockarchivo, segit statushizo rápido de inmediato,mmapsdesapareció y ahora es 1000 veces más rápido.Entonces, si su estado de git es anormalmente lento, verifique
find .git/ -name index.locky elimine las sobras.fuente
Es una pregunta bastante antigua. Sin embargo, me sorprende que nadie haya comentado sobre el archivo binario dado el tamaño del repositorio.
Mencionaste que tu repositorio git es ~ 10GB. Parece que, aparte del problema de NFS y otros problemas de git (que se pueden resolver
git gcy cambiar la configuración de git como se describe en otras respuestas), los comandos de git (git status, git diff, git add) pueden ser lentos debido a la gran cantidad de archivos binarios en el repositorio . git no es bueno para manejar archivos binarios. Puede eliminar el archivo binario innecesario usando el siguiente comando (se proporciona un ejemplo para el archivo NetCDF; tenga una copia de seguridad del repositorio de git antes):git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch *.nc' \ --prune-empty --tag-name-filter cat -- --allNo olvide poner '* .nc' en el archivo gitignore para evitar que git vuelva a enviar el archivo.
fuente