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

Mor*_*der 12 git git-bash windows-subsystem-for-linux

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

当我运行诸如此类的命令时git status,至少需要20秒才能完成.即使没有做出任何改变.

我尝试了多个旧版本的git甚至尝试过Ubuntu,但我仍然遇到了相同的结果.我已尝试在这里和其他网站上运行来自各个帖子的一堆命令,但它们都没有奏效.

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

可能是什么导致了这个?我该怎么做才能解决这个问题?

h-r*_*rai 13

我最终添加了一个 hack。

    alias git=git.exe
Run Code Online (Sandbox Code Playgroud)

现在,它使用 WSL 配置/SSH 设置在 WSL 中运行 Windows git 可执行文件。


小智 6

特别帮助我使用 WSL 2 中的 oh-my-zsh,它在每个命令后运行“git status”。

像上面提到的那样关闭 Defender 也有一点帮助。


Von*_*onC 5

2019年6月更新:WSL 2即将面世,并具有完整的系统调用兼容性。
那应该大大提高Git命令的性能!


原始答案2018:

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

例如,如果您的仓库位于共享文件夹中,则Git的运行速度将大大降低。
对于WSL,可在本地访问该存储库,但可通过各种Linux文件系统操作之间的文件系统转换为NT内核操作来进行。

翻译

这足以说明性能降低,尤其是在大型Git存储库上,另外还要确保您$PATH没有引用可能带有Windows可执行文件而不是Linux文件夹的文件夹。

可能的原因:

  • 文件系统仿真(缓慢):WSL问题2759
  • Shell提示符:确保在基本的Shell提示符下测试命令,而无需进行任何复杂的PS1计算
  • Windows Defender AV:尝试从AV扫描中排除(用于测试)WSL管理的文件系统。


LeG*_*GEC 5

您可以使用GIT_TRACE_PERFORMANCEenv 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
Run Code Online (Sandbox Code Playgroud)