git藏在窗户上很慢

在我的Windows机器上,每次调用都会git stash大约3.5秒的时间,这为我的git commit hook增加了大约7秒的时间。

在Linux下(同一台机器)相同的命令大约需要0.01秒。 性能问题也适用于空的存储库。

我从这个线程和这个线程尝试了以下内容:

  • core.fscache设置为true
  • core.preloadindex设置为true
  • gc.auto设置为256
  • 设置PS1 ='$'
  • 在pipe理模式下运行cmd
  • 运行在cmd.exe而不是git-bash

运行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 

运行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 

从日志中我们看到,在运行git-stash命令和运行git-rev-parse之间需要大约3秒的时间。 还有没有其他的标志我可以运行find瓶颈?

git-stash是一个脚本,而不是在git.exe二进制文件中编译的命令。

在Linux上:我可以在/usr/lib/git-core/git-stash – 我会让你在windows上寻找正确的路径…


这个脚本使用#!/bin/sh来运行,我不知道在windows上运行这个脚本时使用了什么shell实现。

你可以尝试运行它与另一个兼容的shell(这里: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 

你也可以打开-x标志,打印所有执行的命令的跟踪信息,然后直观地检查是否有一个子命令是挂钩的:

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