454 votes

Git Bash est extrêmement lent sous Windows 7 x64

J'ai utilisé Git à la fois sur Windows et Ubuntu pendant le développement d'un petit projet, en passant fréquemment de l'un à l'autre. Le problème est le suivant Git Bash devient constamment lent.

Quand je dis lent, je veux dire que la course cd prend entre 8 et 25 secondes, l'exécution git Les commandes prennent de 5 à 20 secondes, et ls peut prendre jusqu'à 30 secondes parfois. Inutile de dire que ce n'est pas amusant, pour ne pas dire improductif. Je sais que Git est plus lent sous Windows, mais c'est ridicule.

La seule solution qui a fonctionné - temporairement - pour moi a été de désactiver ma connexion réseau (comme suggéré dans le document cette réponse ), lancez Git Bash, puis reconnectez-vous. Parfois, il continue à fonctionner rapidement pendant des jours après avoir fait cela, mais les performances finissent toujours par se dégrader. J'ai parcouru le groupe de discussion msysgit, Stack Overflow, msysgit issue list, etc. pendant des semaines, mais je n'ai pas été capable de trouver des solutions qui fonctionnent.

Jusqu'à présent, j'ai essayé :

  • Ajout des dossiers de Git et de projet à la liste d'exclusion de l'antivirus
  • Désactiver complètement mon antivirus (Kaspersky IS 2011)
  • S'assurer qu'Outlook n'est pas en cours d'exécution (Outlook 2007)
  • Fermeture de toutes les autres applications
  • Exécuter Git Bash en tant qu'administrateur
  • Désactivation de la connexion réseau, démarrage de Git Bash, et maintien de la connexion désactivée
  • Désactiver la connexion réseau, lancer Git Bash, réactiver la connexion (ne fonctionne qu'occasionnellement).
  • Running git gc
  • Et des combinaisons de ce qui précède

J'ai lu que certaines personnes avaient réussi à désactiver l'achèvement de Bash, mais j'aimerais idéalement le garder actif. La version de msysgit est 1.7.3.1-preview20101002 et le système d'exploitation est Windows 7 x64. L'exécution des mêmes choses sous Linux est, comme on pouvait s'y attendre, rapide comme l'éclair. J'utiliserais bien exclusivement Linux, mais j'ai aussi besoin de faire tourner des choses sous Windows (certaines applications, des tests, etc.).

Quelqu'un a-t-il rencontré un problème similaire ? Si oui, quel était le problème sous-jacent et quelle a été la solution (le cas échéant) ?

Cela s'étend au-delà des dépôts Git, mais juste pour référence, les dépôts avec lesquels j'ai utilisé Git étaient plutôt petits : ~4-50 fichiers maximum.

1 votes

Je ne veux pas vous décourager mais Cygwin est très lent sur x64, vous feriez mieux d'essayer sur Windows XP 32bit.

2 votes

5 votes

Sur le même système, ce n'était pas lent il y a six mois. Ils ont dû changer quelque chose...

425voto

shoelzer Points 3910

Vous pouvez accélérer considérablement Git sous Windows en exécutant trois commandes pour définir certaines options de configuration :

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

Notes :

  • core.preloadindex effectue les opérations du système de fichiers en parallèle pour masquer la latence (mise à jour : activé par défaut dans Git 2.1)

  • core.fscache corrige les problèmes d'UAC afin que vous n'ayez pas besoin de lancer Git en tant qu'administrateur (mise à jour : activé par défaut dans Git pour Windows 2.8)

  • gc.auto minimise le nombre de fichiers dans .git/

0 votes

Cela ne m'a pas aidé, mais a aidé l'export PS1='$' mentionné ci-dessous. Je sais donc que pour moi le problème vient de la ligne du terminal.

73 votes

Paramètres complètement inutiles en 2017 (git 2.12) car tous ces trucs sont activés par défaut. Mais le git fonctionne toujours aussi lentement comme une merde.

2 votes

Fonctionne très bien sous Windows 10 également. Bien fait et merci pour cela @shoelzer !

109voto

Chris Dolan Points 5435

Les informations Git s'affichent-elles dans votre invite Bash ? Si c'est le cas, peut-être faites-vous par inadvertance beaucoup trop de travail sur chaque commande. Pour tester cette théorie, essayez la modification temporaire suivante dans Bash :

export PS1='$'

1 votes

Après avoir fait ce changement, changer de répertoire est devenu une opération instantanée et ls est passé à environ 6 secondes. Git est également nettement plus rapide, puisqu'il n'est plus qu'à environ 6 secondes pour branch y status par exemple, au lieu de 10 à 15 secondes.

2 votes

@Gemini14 - Bien. Cela signifie que votre shell Bash a été configuré pour effectuer un travail excessif dans l'invite du shell. Vous devrez modifier votre ~/.bashrc ou ~/.login pour que le changement soit permanent. Quand même, 6 secondes ls est follement lent, donc il y a encore quelque chose qui cloche avec votre machine. Je vous recommande de jouer avec certains des outils SysInternals sur votre machine Windows pour regarder quels fichiers sont ouverts. technet.microsoft.com/fr/us/sysinternals/default

0 votes

@Chris Dolan Je n'ai pas repéré de fichiers étranges ouverts, mais j'ai remarqué que lors de l'exécution de n'importe quel git ou ls , plusieurs processus fils de bash (sh.exe) se sont ouverts (entre 2 et 4). Je ne sais pas si c'est un comportement normal, mais les commandes qui sont lentes semblent ouvrir plus de processus enfants.

93voto

Rob Johnson Points 239

Mon répertoire personnel Windows est sur le réseau, et je soupçonnais que les commandes Git Bash cherchaient d'abord là. En effet, lorsque je regarde $PATH il a énuméré /h/bin d'abord, où /h est un partage sur un serveur de fichiers Windows, même si /h/bin n'existe pas.
J'ai édité /etc/profile et commenté la commande d'exportation qui le met en premier dans $PATH :

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

Cela a permis à mes commandes de s'exécuter beaucoup plus rapidement, probablement parce que Git Bash ne cherche plus les exécutables sur le réseau. Mon /etc/profile était c:\Program Files (x86)\Git\etc\profile .

6 votes

J'ai eu le même problème. J'ai changé HOME="$(cd "$HOME" ; pwd)" a HOME="$(cd "$USERPROFILE" ; pwd)" et maintenant tout est incroyablement rapide. Merci pour le conseil.

2 votes

J'ai réussi en utilisant une variation de ceci : dans le profil, forcez $HOME à $USERPROFILE, en supprimant la référence $HOMEDRIVE. De plus, dans les propriétés du raccourci Git Bash, définissez "Start In" à %USERPROFILE%.

0 votes

Dans la fenêtre vous pouvez chemin est : C:\Program Fichiers (x86) \Git\etc\profile

23voto

Jeff Lamb Points 1926

Bien que votre problème puisse être lié au réseau, j'ai personnellement accéléré mon réseau local. git status (de 7+ secondes à 700 ms) en effectuant deux modifications. Ceci sur un référentiel de 700 Mo avec 21 000 fichiers et un nombre excessif de gros fichiers binaires.

L'une d'elles consiste à activer les précharges d'index parallèles. Depuis une invite de commande :

git config core.preloadindex true
Cela a changé time git status de 7 secondes à 2,5 secondes.

Mise à jour !

Ce qui suit n'est plus nécessaire. Un patch a corrigé ce problème à partir de mysysgit 1.9.4.
https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988
Cependant, vous devez activer le correctif en tapant
git config core.fscache true

J'ai également désactivé l'UAC et le pilote "luafv" (redémarrage nécessaire). Cela désactive un pilote dans Windows Vista, 7 et 8 qui redirige les programmes essayant d'écrire dans des emplacements système et redirige plutôt ces accès vers un répertoire utilisateur.

Pour voir une discussion sur la façon dont cela affecte les performances de Git, lisez ici : https://code.google.com/p/msysgit/issues/detail?id=320

Pour désactiver ce pilote, dans regedit, changez la clé "start" à HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv à 4 pour désactiver le pilote. Ensuite, mettez l'UAC sur son paramètre le plus bas, "ne jamais notifier".

Si la désactivation de ce pilote vous rend méfiant (c'est normal), une alternative est de l'exécuter sur un lecteur (ou une partition) différent de votre partition système. Apparemment, le pilote ne fonctionne que lors de l'accès aux fichiers sur la partition système. J'ai un deuxième disque dur et j'obtiens des résultats identiques lorsque je l'exécute avec cette modification de registre sur mon disque C que sur le disque D sans cette modification.

Ce changement prend time git status de 2,5 secondes à 0,7 seconde.

Vous pouvez également suivre https://github.com/msysgit/git/pull/94 y https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b pour vérifier quels travaux supplémentaires sont en cours pour les problèmes de vitesse dans Windows.

11 votes

Cela ne fait que mettre en lumière, une fois de plus, les idioties et les méchantes solutions Microsoft, à des problèmes résolus dans Unix de manière simple et élégante en 1968. Combien d'efforts de production, de temps et d'argent ont été gâchés par le gonflement et le manque de refactoring/flexibilité/audace de Microsoft dans le monde entier ?

23 votes

Je me souviens avoir utilisé git en 68, c'était glorieux.

2 votes

Haha un an avant que Linus n'arrive @CharlieBrown

20voto

Gemini14 Points 1396

Il semble que la désinstallation complète de Git, le redémarrage (le remède classique de Windows) et la réinstallation de Git aient été le remède. J'ai également effacé tous les fichiers de configuration bash qui restaient (ils avaient été créés manuellement). Tout est à nouveau rapide.

Si, pour une raison quelconque, la réinstallation n'est pas possible (ou souhaitable), alors j'essaierais certainement de modifier la variable PS1 référencée dans le fichier La réponse de Chris Dolan il a entraîné des accélérations significatives dans certaines opérations.

4 votes

La réinstallation sans redémarrage n'a pas fonctionné, la désinstallation-démarrage-installation a fonctionné. Merci ! Ce serait bien de savoir pourquoi et comment bash est devenu si lent, cependant.

0 votes

La réinstallation avec un redémarrage entre les deux n'a fait aucune différence pour moi.

0 votes

@RyanW J'ai bien peur de ne pas pouvoir vous aider au-delà de la solution ci-dessus qui a fonctionné pour moi, mais puisque ce problème ne semble pas encore avoir été corrigé de façon permanente, vous pourriez vouloir entrer en contact avec les mainteneurs de msysgit et voir s'ils peuvent trouver la cause de ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X