我们有一个非常大的项目,总共提交了近15.000次提交。我使用WSL在我的Windows机器上运行Debian 9.3
。我的git版本是2.17.0
。
当我运行git status
等命令时,至少需要20秒才能完成。即使没有做出任何改变。
我尝试了多个旧版本的git甚至尝试过Ubuntu,但我仍然遇到了相同的结果。我尝试在这里和其他网站上运行来自各个帖子的一堆命令,但没有一个能够工作。
有趣的是:当我在Windows上打开cmd.exe
或Git Bash时,运行git status
只需不到一秒钟。
可能导致这种情况的原因是什么?我该怎么做才能解决这个问题?
答案 0 :(得分:4)
2019年6月更新:WSL 2 is coming,并具有完整的系统调用兼容性 这应该会大大提高Git命令的性能!
原始答案2018:
Git在没有任何中间层的主机上执行时效果最佳。
例如,如果您的仓库位于共享文件夹中,Git会慢得多 在WSL的情况下,repo是本地访问的,但是通过各种Linux文件系统操作之间的filesystem translation进入NT内核操作。
这足以解释降级的性能,尤其是在大型Git存储库上
另外,请确保您的$PATH
不引用可能被调用的Windows可执行文件而不是Linux文件夹
可能的原因:
PS1
计算答案 1 :(得分:1)
在使用Ubuntu的WSL中,我遇到的第一个“ git status”命令比第二个慢得多。可能在第一次运行时完成了任何缓存或索引。第二个“ git status”速度对我来说还可以。
答案 2 :(得分:1)
特别帮助我在WSL 2中使用oh-my-zsh,该命令在每个命令后都运行“ git status”。
同样,如上所述关闭Defender也会有所帮助。
答案 3 :(得分:0)
您可以使用GIT_TRACE_PERFORMANCE
env var:
$ GIT_TRACE_PERFORMANCE=1 git status -sb -uno
08:51:54.525808 read-cache.c:1889 performance: 0.000330659 s: read cache .git/index
08:51:54.528532 preload-index.c:112 performance: 0.002669928 s: preload index
08:51:54.528667 read-cache.c:1447 performance: 0.000109768 s: refresh index
08:51:54.528892 diff-lib.c:250 performance: 0.000056516 s: diff-files
08:51:54.534630 diff-lib.c:527 performance: 0.005070461 s: diff-index
## wip/foo
08:51:54.536419 trace.c:420 performance: 0.013503141 s: git command: git status -sb -uno
答案 4 :(得分:0)
冉
time git clone https://github.com/git/git.git
和
time git clone git git.1
在当前WSL的Thinkpad T460上,MSYS2和虚拟盒Fedora 28(没有gui,Putty)。
本地克隆的实时时间是
Fedora 3s, WSL 67s, MSYS2 65s
关闭Defender后,时间会转到
WSL 11s, MSYS2 13s
所以
请随意重复这个小测试。
答案 5 :(得分:0)
WSL 确实是一件有趣的事情。 git
WSL 中的速度与读取/写入文件的文件系统非常相关。
确保根据文件系统路径使用 git
或 git.exe
。
在 ~/.bashrc
的末尾添加以下代码段(用于 Bash、ZSH 和朋友)。
function git() {
if $(pwd -P | grep -q "^\/mnt\/c\/*"); then
git.exe "$@"
else
command git "$@"
fi
}
如果您使用的是 fish
,则可以使用以下代码段:
function git --wraps git
if pwd -P | grep -q "^\/mnt\/c\/*"
git.exe $argv
else
command git $argv
end
end
就我而言,虽然我正在处理 WSL 的文件系统,但使用自定义 git
命令修复了该问题,看起来 git
仍有机会在 WSL 的文件系统之外做一些工作。< /p>
<块引用>
感谢 Christoph Grabo (asaaki),他最初发布了此解决方案 here。
答案 6 :(得分:0)
我最终添加了一个 hack。
alias git=git.exe
现在,它使用 WSL 配置/SSH 设置在 WSL 中运行 Windows git 可执行文件。