Tengo un repositorio de 10 GB en una máquina Linux que está en NFS. La primera vez git status
dura 36 minutos y la siguiente git status
8 minutos. Parece que Git depende del sistema operativo para almacenar archivos en caché. Solo los primeros git
comandos como commit
, status
que implican empaquetar / reempaquetar todo el repositorio, requieren mucho tiempo para un repositorio enorme. No estoy seguro de si lo ha utilizado git status
en un repositorio tan grande, pero ¿alguien se ha encontrado con este problema?
He tratado git gc
, git clean
, git repack
pero 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-unchanged
bandera 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.preloadindex
en verdadero; consulta losgit-config
documentos 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.preloadindex
La 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.showUntrackedFiles
archivo 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 gc
ygit clean
. Juro que originalmente no estaba allí, pero no veo ningún cambio en las ediciones. ¡Lo siento por eso!fuente
git gc
reduzca el tiempo degit log
ejecució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 = dirty
los 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_GROW
macro al reasignarstring_list
Ademá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 status
con: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-behind
opció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 status
rendimiento: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.version
configuració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.threads
configuración de configuracióngit config --global core.preloadIndex true
Hizo el trabajo por mí. Consulta la documentación oficial aquí .
fuente
2.7.4
. Utilizo Linux Subsystem para Windows e incluso actualizadoapt-get
parece 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-submodules
aceleró 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.lock
Archivos sobrantesgit status
puede ser patológicamente lento cuando tieneindex.lock
archivos sobrantes .Esto sucede especialmente cuando lo tiene
git submodules
, porque entonces a menudo no nota los archivos sobrantes.Resumen: Ejecute
find .git/ -name index.lock
y 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 status
en miassets
submódulo git tomó 1.7 segundos.Encontrado con
strace
ese git, leyó todos mis archivos grandes allí conmmap
. No suele hacer eso, normalmentestat
es suficiente.Busqué en Google el problema y encontré el problema Uso del índice y Racy Git .
Intenté
git update-index somefile
(en mi casogitignore
en 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.lock
archivo, segit status
hizo rápido de inmediato,mmaps
desapareció y ahora es 1000 veces más rápido.Entonces, si su estado de git es anormalmente lento, verifique
find .git/ -name index.lock
y 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 gc
y 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 -- --all
No olvide poner '* .nc' en el archivo gitignore para evitar que git vuelva a enviar el archivo.
fuente