Git Bash es extremadamente lento en Windows 7 x64


He estado usando Git tanto en Windows como en Ubuntu durante el desarrollo de un pequeño proyecto, con frecuencia cambiando de un lado a otro entre los dos. El problema es que Git Bash se vuelve constantemente lento.

Cuando digo lento, me refiero a que ejecutar cd toma entre 8 y 25 segundos, ejecutar git comandos toma entre 5 y 20 segundos, y ls puede tomar hasta 30 segundos a veces. No hace falta decir que esto no es divertido, por no hablar de improductivo. Sé que Git es más lento en Windows, pero esto es ridículo.

La única solución que ha funcionado temporarily temporalmente has para mí ha sido deshabilitar mi conexión de red (como se sugiere en esta respuesta), iniciar Git Bash y luego volver a conectar. A veces continúa corriendo rápidamente durante días después de hacer eso, pero el rendimiento siempre se degrada eventualmente. He rastreado a través del grupo de discusión de msysgit, el desbordamiento de pila, la lista de problemas de msysgit, etc. de vez en cuando durante semanas, pero no he sido capaz de encontrar soluciones que trabajo.

Hasta ahora, he intentado:

  • Agregar carpetas de Git y proyectos a la lista de exclusión del escáner de virus
  • Desactivar mi escáner de virus por completo (Kaspersky ES 2011)
  • Asegurando que Outlook no se está ejecutando (Outlook 2007)
  • Apagar todas las demás aplicaciones
  • Ejecutando Git Bash como administrador
  • Deshabilitar la conexión de red, iniciar Git Bash y mantener la conexión deshabilitada
  • Deshabilitar la conexión de red, iniciar Git Bash, volver a habilitar la conexión (funciona solo ocasionalmente)
  • Corriendo git gc
  • Y combinaciones de lo anterior

Leí que un par de personas tuvieron éxito desactivando la finalización de Bash, pero idealmente me gustaría mantener eso activo. La versión de msysgit es 1.7.3.1-preview20101002 y el sistema operativo es Windows 7 x64. Ejecutar las mismas cosas en Linux es, como era de esperar, muy rápido. Usaría Linux exclusivamente, pero también necesito ejecutar cosas en Windows (ciertas aplicaciones, pruebas, etc.).

¿Alguien ha encontrado un problema similar? En caso afirmativo, ¿cuál es el problema subyacente y cuál es la solución (si la hay)?

Esto se extiende más allá de los repositorios de Git, pero solo como referencia, los repositorios con los que he estado usando Git han sido bastante pequeños: ~4-50 archivos como máximo.

Author: Peter Mortensen, 2010-12-19

22 answers

Puede acelerar significativamente Git en Windows ejecutando tres comandos para establecer algunas opciones de configuración:

$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global gc.auto 256

Notas:

  • core.preloadindex realiza operaciones del sistema de archivos en paralelo para ocultar la latencia (actualización: habilitada por defecto en Git 2.1)

  • core.fscache soluciona problemas de UAC para que no necesites ejecutar Git como administrador (actualización: habilitada por defecto en Git para Windows 2.8)

  • gc.auto minimiza el número de archivos .git /

 368
Author: shoelzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 08:24:06

¿Tienes información de Git mostrada en tu prompt de Bash? Si es así, tal vez usted está haciendo inadvertidamente demasiado trabajo en cada comando. Para probar esta teoría intente el siguiente cambio temporal en Bash:

export PS1='$'
 79
Author: Chris Dolan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-19 22:10:10

Mi directorio personal de Windows está en la red, y sospeché que los comandos de Git Bash estaban buscando allí primero. Por supuesto, cuando miré PATH PATH, listó /h / bin primero, donde /h es un recurso compartido en un servidor de archivos de Windows, aunque /h / bin no existe. Edité/etc / profile y comenté el comando export que lo pone primero en PATH PATH:

#export PATH="$HOME/bin:$PATH"

Esto hizo que mis comandos se ejecutaran mucho más rápido, probablemente porque Git Bash ya no está buscando los ejecutables en la red. Mi /etc / profile was c:\Program Files (x86)\Git\etc\profile.

 68
Author: Rob Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 14:27:32

Encontré que la unidad de red era el problema de rendimiento. HOME apuntaba a un recurso compartido de red lento. No pude anular HOMEDRIVE pero eso no es un problema por lo que he visto.

Establezca la variable de entorno haciendo clic con el botón derecho su ordenador en el escritorio Variables> propiedades settings> Configuración avanzada del sistema Variables > Variables de entorno Añadir a la sección Variables de usuario

HOME=%USERPROFILE%
 29
Author: MichaelK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-17 08:49:32

En una extensión de la respuesta de Chris Dolan, usé la siguiente opción PS1. Simplemente agregue el fragmento de código a su ~/.perfil (en Windows 7: C:/Users/USERNAME/.perfil).

fast_git_ps1 ()
{
    printf -- "$(git branch 2>/dev/null | sed -ne '/^\* / s/^\* \(.*\)/ [\1] / p')"
}

PS1='\[\033]0;$MSYSTEM:\w\007
\033[32m\]\u@\h \[\033[33m\w$(fast_git_ps1)\033[0m\]
$ '

Esto conserva el beneficio de un shell coloreado y la visualización del nombre de la rama actual (si está en un repositorio Git), pero es significativamente más rápido en mi máquina, de ~0.75 s a 0.1 s.

Esto se basa en esta entrada de blog.

 21
Author: Wilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:13:39

Si bien su problema puede estar basado en la red, personalmente he acelerado mis llamadas locales git status diez veces (7+ segundos hasta 700 ms) haciendo dos modificaciones. Esto es en un repositorio de 700 MB con 21,000 archivos y un número excesivo de archivos binarios grandes.

Uno está habilitando precargas de índices paralelos. Desde un símbolo del sistema:

git config core.preloadindex true
Esto cambió time git status de 7 segundos a 2.5 segundos.

Actualización!

Lo siguiente ya no es necesario. Un parche tiene solucionado esto a partir de mysysgit 1.9.4
https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988
Sin embargo, debe habilitar la corrección escribiendo
git config core.fscache true

También desactivé el UAC y el controlador "luafv" (se requiere reinicio). Esto deshabilita un controlador en Windows Vista, 7 y 8 que redirige programas que intentan escribir en ubicaciones del sistema y en su lugar redirige esos accesos a un directorio de usuario.

Para ver una discusión sobre cómo esto afecta a Git rendimiento, leer aquí: https://code.google.com/p/msysgit/issues/detail?id=320

Para deshabilitar este controlador, en regedit, cambie la tecla "start" en HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv a 4 para deshabilitar el controlador. Luego, ponga UAC a su configuración más baja, "nunca notificar".

Si la desactivación de este controlador le hace desconfiar (debería hacerlo), se está ejecutando una alternativa en una unidad (o partición) diferente a la partición del sistema. Al parecer, el controlador solo se ejecuta en el acceso a archivos en la partición del sistema. Tengo un segundo disco duro y ver resultados idénticos cuando se ejecuta con esta modificación del registro en mi unidad C como lo hago sin ella en la unidad D.

Este cambio toma time git status de 2.5 segundos a 0.7 segundos.

Es posible que también desee seguir https://github.com/msysgit/git/pull/94 y https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b para ver qué trabajo adicional está en marcha para problemas de velocidad en Windows.

 21
Author: Jeff Lamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:25:26

Parece que desinstalar completamente Git, reiniciar (la cura clásica de Windows) y reinstalar Git fue la cura. También eliminé todos los archivos de configuración de bash que quedaban (se crearon manualmente). Todo es rápido de nuevo.

Si por alguna razón la reinstalación no es posible (o deseable), entonces definitivamente intentaría cambiar la variable PS1 a la que se hace referencia en La respuesta de Chris Dolan; resultó en aceleraciones significativas en ciertas operaciones.

 14
Author: Gemini14,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 08:48:06

Resolví mi problema de Git lento en Windows 7 x64 iniciando cmd.exe con "Ejecutar como administrador".

 9
Author: Chris Pawlukowsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 08:46:43

Vi una mejora decente al configurar core.preloadindex a true como se recomienda aquí.

 8
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 10:49:04

Como se indica en las respuestas de Chris Dolan y Wilbert, PS1 te ralentiza.

En lugar de deshabilitar completamente (como sugiere Dolan) o usar el script ofrecido por Wilbert, uso un "PS1 tonto" que es mucho más rápido.

Utiliza (git symbolic-ref -q HEAD || git rev-parse --short HEAD) 2> /dev/null:

PS1='\033[33m\]\w \n\[\033[32m\]$((git symbolic-ref -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null) \[\033[00m\]# '

En mi Cygwin, esto es más rápido que La respuesta "fast_Git_PS1" de Wilbert - 200 ms vs.400 ms, por lo que elimina un poco de su pronta lentitud.

No Es tan sofisticado como __git_ps1 - por ejemplo, no cambia el mensaje cuando CD en el .directorio git, etc. pero para el uso diario normal es lo suficientemente bueno y rápido.

Esto fue probado en Git 1.7.9 (Cygwin, pero debería funcionar en cualquier plataforma).

 5
Author: sinelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:17:07

Estaba teniendo el mismo problema, tanto en Git Bash como en Git GUI. Ambos programas solían funcionar bien, pero luego se ralentizaban aleatoriamente y no podía entender por qué.

Resulta que fue Avast. Avast ha causado que le sucedan cosas extrañas a varios programas (incluidos los programas que escribo), así que lo deshabilité por un segundo, y por supuesto, Bash ahora se ejecuta tan rápido como en Linux. Acabo de agregar la carpeta Git program files (C:\Program Files\Git) a la lista de exclusión de Avast, y ahora se ejecuta como rápido como lo hace en Linux.

Y sí, me doy cuenta de que el software antivirus no fue el problema en el post original, pero voy a poner esto aquí en caso de que sea útil para alguien.

 5
Author: Nkosi Dean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:30:16

También puede obtener un impulso de rendimiento muy subsquente cambiando la siguiente configuración de Git:

git config --global status.submoduleSummary false

Al ejecutar el comando simple git status en la ventana 7 x64, mi computadora tardó más de 30 segundos en ejecutarse. Una vez definida esta opción, el comando es inmediato.

Activar el propio rastreo de Git como se explica en la siguiente página me ayudó a encontrar el origen del problema, que podría diferir en su instalación: https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow

 4
Author: Olivier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:33:26

Si usas Git desde cmd, intenta ejecutarlo desde Git Bash. En cmd, git.exe es en realidad un wrapper que configura el entorno correcto cada vez que lo inicias, y solo entonces lanza el git real.exe. Puede tomar hasta el doble de tiempo que se requiere para hacer lo que quieres. Y Git Bash configura el entorno solo cuando se inicia.

 2
Author: Eugene Pakhomov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 07:36:26

Respuestas combinadas:

  1. Wilbert - qué información incluir en PS1
  2. sinelaw's - (<branch_name>) o (<sha>)
# https://unix.stackexchange.com/questions/140610/using-variables-to-store-terminal-color-codes-for-ps1/140618#140618
# https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-ps1-prompt
# \033 is the same as \e
# 0;32 is the same as 32
CYAN="$(echo -e "\e[1;36m")"
GREEN="$(echo -e "\e[32m")"
YELLOW="$(echo -e "\e[33m")"
RESET="$(echo -e "\e[0m")"

# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://stackoverflow.com/questions/39518124/check-if-directory-is-git-repository-without-having-to-cd-into-it/39518382#39518382
fast_git_ps1 ()
{
    git -C . rev-parse 2>/dev/null && echo " ($((git symbolic-ref --short -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null))"
}

# you need \] at the end for colors
# Don't set \[ at the beginning or ctrl+up for history will work strangely
PS1='${GREEN}\u@\h ${YELLOW}\w${CYAN}$(fast_git_ps1)${RESET}\] $ '

Resultado:

frolowr @ RWAMW36650 / c / projects / elm-math-kids (master) $

 2
Author: rofrol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 14:16:44

He encontrado el mismo problema al ejecutar Git para Windows (msysgit) en Windows 7 x64 como una cuenta de usuario limitada durante bastante tiempo.

Por lo que he leído aquí y en otros lugares, el tema común parece ser la falta de privilegios administrativos y/o UAC. Dado que UAC está apagado en mi sistema, la explicación de que está tratando de escribir/eliminar algo en el directorio de archivos de programa tiene más sentido para mí.

En cualquier caso, he resuelto mi problema instalando el portable versión de Git 1.8 con zipinstaller. Tenga en cuenta que tuve que desempacar el .archivo de distribución 7z y volver a empaquetarlo como un archivo ZIP para que zipinstaller funcione. También tuve que agregar manualmente ese directorio a la ruta de mi sistema.

La actuación está bien ahora. A pesar de que está instalado en el directorio Program Files (x86), para el que no tengo permisos como usuario limitado, no parece sufrir el mismo problema.

Atribuyo esto ya sea al hecho de que la versión portable es un poco más conservador en donde escribe / elimina archivos, que es probablemente el caso, o para la actualización de 1.7 a 1.8. No voy a tratar de precisar cuál es la razón, basta decir que funciona mucho mejor ahora, incluyendo Bash.

 2
Author: Binary Phile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:15:10

En mi caso, en realidad fue Avast antivirus lo que llevó a Git Bash e incluso a PowerShell a volverse realmente lento.

Primero intenté desactivar Avast durante 10 minutos para ver si mejoraba la velocidad y lo hizo. Después, agregué todo el directorio de instalación de Git Bash como una excepción en Avast, para Leer, Escribir y Ejecutar. En mi caso eso fue C:\Program Files\Git\*.

 2
Author: Mastergalen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:32:40

Además de estas otras respuestas, he acelerado proyectos con múltiples submódulos utilizando la obtención de submódulos paralelos (desde Git 2.8 a principios de 2016).

Esto se puede hacer con git fetch --recurse-submodules -j8 y establecer con git config --global submodule.fetchJobs 8, o el número de núcleos que tenga/desee usar.

 2
Author: codehearts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:34:29

Nada de lo anterior fue capaz de ayudarme. En mi escenario, el problema se mostraba así:

  • Cualquier comando ll era lento (tardaba unos 3 segundos en ejecutarse)
  • Cualquier comando posterior ll se ejecutó instantáneamente, pero solo si dentro de los 45 segundos del comando ls anterior.

Cuando se trataba de depurar con Process Monitor se encontró que antes de cada comando había una solicitud DNS.

Tan pronto como deshabilitado mi firewall (Comodo en mi caso) y dejar que el comando ejecute el problema se ha ido. Y no está regresando cuando el firewall se volvió a encender. Con la primera oportunidad actualizaré esta respuesta con más detalles sobre qué proceso estaba haciendo una solicitud de bloqueo de DNS y cuál era el objetivo.

BR, G

 1
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-18 02:42:41

Solo me ayudó desactivar los gráficos AMD Radeon (o Intel Graphics) en el Administrador de dispositivos.

introduzca la descripción de la imagen aquí

Encontré la respuesta aquí: https://superuser.com/questions/1160349/git-is-extremely-slow-on-windows#=

 1
Author: Alexander Trofimov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-12 11:03:40

También tuve problemas con la lentitud de git PS1, aunque durante mucho tiempo pensé que era un problema de tamaño de base de datos (repositorio grande) y estaba probando varios trucos git gc, y estaba buscando otras razones, al igual que usted. Sin embargo, en mi caso, el problema era esta línea:

function ps1_gitify
{
   status=$(git status 2>/dev/null )      # <--------------------
   if [[ $status =~ "fatal: Not a git repository" ]]
   then
       echo ""
   else
       echo "$(ps1_git_branch_name)  $(ps1_git_get_sha)"
  fi
}

Hacer el git status para cada línea de estado de la línea de comandos fue lento. Ouch. Fue algo que escribí a mano. Vi que era un problema cuando probé el

export PS1='$'

Como se menciona en una respuesta aquí. Comando la línea era muy rápida.

Ahora estoy usando esto:

function we_are_in_git_work_tree
{
    git rev-parse --is-inside-work-tree &> /dev/null
}

function ps1_gitify
{
    if ! we_are_in_git_work_tree
    then
    ...

Desde el post de desbordamiento de pila Línea PS1 con rama y colores actuales de git y funciona bien. Una vez más tener una línea de comandos Git rápida.

 0
Author: Koshmaar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:28:03

En mi caso, el atajo de Git Bash se estableció en Start in:%HOMEDRIVE%%HOMEPATH% (puede verificar esto haciendo clic derecho en Git Bash y seleccionando propiedades). Esta era la unidad de red.

La solución es hacer que apunte a %HOME%. Si no lo tiene, puede configurarlo en las variables de entorno y ahora Git Bash debería ser increíblemente rápido.

 0
Author: mahacoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:30:45

Un compañero de trabajo mío tuvo problemas con Git en Windows (7) git status checkout y add eran rápidos, pero git commit tomaban edades.

Todavía estamos tratando de encontrar la causa raíz de esto, pero clonar el repositorio en una nueva carpeta solucionó su problema.

 0
Author: mrcl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 20:31:35