54 votes

git stash est lent sous Windows

Sur ma machine Windows git stash a environ 3,5 secondes de surcharge à chaque invocation, ce qui ajoute environ 7 secondes à mon hook de commit git.

La même commande sous linux (même machine) prend environ 0,01 seconde. Le problème de performance s'applique également aux dépôts vides.

J'ai essayé ce qui suit à partir de ce fil y ce fil :

  • core.fscache est réglé sur true
  • core.preloadindex est réglé sur true
  • gc.auto est réglé sur 256
  • Réglage PS1='$ '
  • Exécution de cmd en mode administration
  • Courir à l'intérieur cmd.exe au lieu de git-bash

Running GIT_TRACE=true git stash list

16:58:16.844591 git.c:563               trace: exec: 'git-stash' 'list'
16:58:16.844591 run-command.c:336       trace: run_command: 'git-stash' 'list'
16:58:19.699591 git.c:350               trace: built-in: git 'rev-parse' '--git-dir'
16:58:19.859591 git.c:350               trace: built-in: git 'rev-parse' '--git-path' 'objects'
16:58:20.069591 git.c:350               trace: built-in: git 'rev-parse' '--show-toplevel'
16:58:20.154591 git.c:350               trace: built-in: git 'rev-parse' '--git-path' 'index'
16:58:20.244591 git.c:350               trace: built-in: git 'config' '--get-colorbool' 'color.interactive'
16:58:20.334591 git.c:350               trace: built-in: git 'config' '--get-color' 'color.interactive.help' 'red bold'
16:58:20.424591 git.c:350               trace: built-in: git 'config' '--get-color' '' 'reset'
16:58:20.514591 git.c:350               trace: built-in: git 'rev-parse' '--verify' '--quiet' 'refs/stash'

real    0m3.845s
user    0m0.000s
sys     0m0.047s

Running GIT_TRACE_PERFORMANCE=true git stash list

16:59:18.414591 trace.c:420             performance: 0.001078046 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-dir'                                          
16:59:18.569591 trace.c:420             performance: 0.000947184 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'objects'                               
16:59:18.779591 trace.c:420             performance: 0.001253627 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--show-toplevel'                                    
16:59:18.869591 trace.c:420             performance: 0.001285517 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'index'                                 
16:59:18.955591 trace.c:420             performance: 0.001139994 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-colorbool' 'color.interactive'                   
16:59:19.040591 trace.c:420             performance: 0.001182881 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' 'color.interactive.help' 'red bold'       
16:59:19.125591 trace.c:420             performance: 0.001128997 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' '' 'reset'                                
16:59:19.215591 trace.c:420             performance: 0.001567766 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--verify' '--quiet' 'refs/stash'                    
16:59:19.295591 trace.c:420             performance: 3.730583540 s: git command: 'C:\Program Files\Git\mingw64\bin\git.exe' 'stash' 'list'                                                                

real    0m3.819s                                                                                                                                                                                          
user    0m0.000s                                                                                                                                                                                          
sys     0m0.062s                                                                                                                                                                                          

D'après le journal, nous constatons qu'il faut environ 3 secondes entre l'exécution de la commande git-stash et l'exécution de git-rev-parse. Y a-t-il d'autres indicateurs que je peux utiliser pour trouver le goulot d'étranglement ?

0 votes

Il est possible que votre référentiel soit volumineux, pouvez-vous essayer de lancer git gc sur votre référentiel local ET distant ?

0 votes

Cela prend le même temps dans un référentiel vide. J'ai mis à jour la question.

0 votes

@sighol avez-vous traversé ce fil et testé cet indice

21voto

VonC Points 414372

Avec Git pour Windows 2.19 (sept. 2018), git stash (y git rebase ) ne sont plus script seulement, mais en fait un binaire compilé avec git.exe .
Voir git-for-Windows/build-extra PR 203 .

Pour les activer, tapez :

git config --global rebase.useBuiltin true
git config --global stash.useBuiltin true

Avertissement :

Aussi agréables que soient ces accélérations, les correctifs en question sont toujours en cours d'élaboration et n'ont pas du tout été testés.

Donc, pour le moment, la version script de git stash reste la valeur par défaut, de cette façon :

  • Les utilisateurs qui souhaitent bénéficier de l'amélioration brute de la vitesse obtenue grâce à trois projets Google Summer of Code menés en parallèle peuvent le faire,
  • tandis que les autres, qui sont réticents à jouer les cobayes en n'exécutant que du code bien testé, peuvent rester du côté sûr.

Le point demeure : dans les prochaines versions de Git, le script bash pour git-stash finira par disparaître, et son remplacement est et sera plus rapide.

Note : la prochaine version sera Git 2.27 (Q2 2020) : " git stash "a gardé une porte de sortie pour utiliser la version scriptée pendant quelques versions, qui est devenue obsolète.

Il a été supprimé.

Ver commettre 8a2cd3f , commettre b0c7362 (03 mars 2020) par Thomas Gummerer ( tgummerer ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 369ae75 , 27 mars 2020)

stash : retirer le stash.useBuiltin réglage

Signé par : Thomas Gummerer

Retirer le stash.useBuiltin qui a été ajouté comme échappatoire pour désactiver la version intégrée de stash publiée pour la première fois avec Git 2.22.

Le portage de l'ancienne version est une charge de maintenance, et est en fait devenu obsolète en échouant à un test depuis la version 2.23, sans que personne ne le remarque jusqu'à présent.

Les utilisateurs seraient donc invités à se rabattre sur une version potentiellement boguée de l'outil.

On avait l'habitude de payer pour git config pour obtenir le useBuiltin pour éviter de modifier l'état global avant de créer legacy-stash.
Cependant, cela n'est plus nécessaire, il suffit d'utiliser le ' git_config pour obtenir le paramètre à la place.

Similaire à ce que nous avons fait dans d03ebd411c (" rebase : supprimer le paramètre rebase.useBuiltin", 2019-03-18, Git v2.22.0-rc0 -- fusionner répertorié dans lot n° 5 ), où nous supprimons le paramètre correspondant pour rebase, nous laissons la documentation en place, afin que les gens puissent s'y référer lorsqu'ils la recherchent en ligne, et que nous puissions y faire référence dans le message de livraison.


Mise à jour Q2 2019, avec Git 2.22, git stash est entièrement réécrit en C. ² Voir commettre 40af146 , commettre 48ee24a , commettre ef0f0b4 , commettre 64fe9c2 , commettre 1ac528c , commettre d553f53 , commettre d4788af , commettre 41e0dd5 , commettre dc7bd38 , commit 130f269 , commettre bef55dc , commettre dac566c , commettre ab8ad46 (25 février 2019) par Paul-Sebastian Ungureanu ( weekly-digest[bot] ) .
Voir commettre c4de61d , commettre 577c199 , commit 4e2dd39 , commettre 8a0fc8d (25 février 2019) par Joel Teichroeb ( klusark ) .
Voir commettre 7906af0 , commettre 90a4627 , commettre 8d8e9c2 (25 février 2019) par Johannes Schindelin ( dscho ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre e36adf7 , 22 avril 2019)

Vous pouvez toujours utiliser l'interpréteur de commandes script avec git legacy-stash .

Et :

stash : convertir stash--helper.c en stash.c

L'ancien shell script git-stash.sh a été supprimé et remplacé entièrement par builtin/stash.c .
Pour ce faire, create y push ont été adaptés pour travailler sans stash.sh .

Par exemple, avant cet engagement, git stash create appelé git stash--helper create --message "$*" . Si elle a appelé git stash--helper create "$@" alors certains de ces changements n'auraient pas été nécessaires.

Cette validation supprime également le mot helper puisque maintenant stash est appelé directement et non par un shell script.

Il y a des optimisations :

stash : optimiser get_untracked_files() y check_changes()

Ce commits introduit une optimisation en évitant d'appeler les mêmes fonctions à nouveau.
Par exemple, git stash push -u appelle à certains moments les fonctions suivantes :

  • check_changes() (à l'intérieur do_push_stash() )
  • do_create_stash() qui appelle : check_changes() et get_untracked_files()

Notez que check_changes() appelle également get_untracked_files() .
Donc, check_changes() est appelé 2 fois et get_untracked_files() 3 fois.

L'ancienne fonction check_changes() se compose désormais de deux fonctions : get_untracked_files() y check_changes_tracked_files() .

Ce sont les chaînes d'appel pour push y create :

  • push_stash() -> do_push_stash() -> do_create_stash()
  • create_stash() -> do_create_stash()

Pour éviter d'appeler les mêmes fonctions à plusieurs reprises, check_changes() à l'intérieur de do_create_stash() est maintenant placé dans les fonctions de l'appelant ( create_stash() y do_push_stash() ).
De cette façon check_changes() y get_untracked files() sont appelés une seule fois.

0 votes

Merci ! Il fonctionne rapidement maintenant. Pour les petites modifications, il faut environ 0,3s sur mon ordinateur pour utiliser la réserve.

0 votes

Aucune amélioration avec la version 2.18.0.Windows.1 de git

1 votes

@JerryGoyal Mais la 2.18 semble vieille. La 2.21 est la version actuelle, elle est capable de lister les commits plus rapidement ( stackoverflow.com/a/53382508/6309 ) et a des améliorations supplémentaires sur rebase ( stackoverflow.com/a/54973838/6309 )

3voto

LeGEC Points 7199

git-stash est un script, et non une commande compilée dans l'application git.exe binaire.

Sous linux : je peux trouver git-stash à l'adresse /usr/lib/git-core/git-stash - Je vous laisse chercher le chemin correct sur Windows ...


Ce script utilise #!/bin/sh Je ne sais pas quelle implémentation de l'interpréteur de commandes est utilisée lorsque vous l'exécutez sous Windows.

Vous pouvez essayer de l'exécuter avec un autre shell compatible (ici : bash) :

# the git-core/ dir needs to be in the PATH,
# obviously  you will need to provide the correct path for your git-core dir

$ PATH=/usr/lib/git-core:$PATH bash /usr/lib/git-core/git-stash

Vous pouvez également tourner le -x qui imprimera une trace de toutes les commandes exécutées, et vérifiera visuellement si l'une des sous-commandes semble être le crochet :

$ PATH=/usr/lib/git-core:$PATH bash -x /usr/lib/git-core/git-stash

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