在Debian上运行git命令& WSL上的Ubuntu对大型项目来说真的很慢

时间:2018-05-08 10:59:56

标签: git git-bash windows-subsystem-for-linux

我们有一个非常大的项目,总共提交了近15.000次提交。我使用WSL在我的Windows机器上运行Debian 9.3。我的git版本是2.17.0

当我运行git status等命令时,至少需要20秒才能完成。即使没有做出任何改变。

我尝试了多个旧版本的git甚至尝试过Ubuntu,但我仍然遇到了相同的结果。我尝试在这里和其他网站上运行来自各个帖子的一堆命令,但没有一个能够工作。

有趣的是:当我在Windows上打开cmd.exe或Git Bash时,运行git status只需不到一秒钟。

可能导致这种情况的原因是什么?我该怎么做才能解决这个问题?

7 个答案:

答案 0 :(得分:4)

2019年6月更新:WSL 2 is coming,并具有完整的系统调用兼容性 这应该会大大提高Git命令的性能!

原始答案2018:

Git在没有任何中间层的主机上执行时效果最佳。

例如,如果您的仓库位于共享文件夹中,Git会慢得多 在WSL的情况下,repo是本地访问的,但是通过各种Linux文件系统操作之间的filesystem translation进入NT内核操作。

translation

这足以解释降级的性能,尤其是在大型Git存储库上 另外,请确保您的$PATH不引用可能被调用的Windows可执行文件而不是Linux文件夹

可能的原因:

  • filesystem emulation(慢):WSL issue 2759
  • Shell Prompt:确保在基本的shell提示符下测试您的命令,没有任何复杂的PS1计算
  • Windows Defender AV:尝试从AV扫描中排除(用于测试)WSL管理的文件系统。

答案 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

所以

  • 没有GUI的VirtualBoxed Fedora是最快的
  • 后卫很贵。排除你的git工作根。
  • 如果WSL git工作目录在〜或/ c / mnt
  • 下,则没有发现实际差异

请随意重复这个小测试。

答案 5 :(得分:0)

WSL2

WSL 确实是一件有趣的事情。 git WSL 中的速度与读取/写入文件的文件系统非常相关。

解决方案:

确保根据文件系统路径使用 gitgit.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 可执行文件。