oh-my-zsh 在某些 Git 仓库上速度缓慢

202

我最近开始使用Zsh,感觉非常好。不幸的是,对于我认为是“主要”项目的项目,所有操作都变得缓慢了。我的意思是,每次运行命令(例如ls)时,在命令执行和可以再次使用终端之间会有大约五秒钟的延迟。

这个项目与其他项目的区别在哪里,导致Zsh如此缓慢?我认为这可能是Zsh特有的问题,因为在我开始使用Zsh之前没有任何问题。我尝试执行git clean,但没有任何明显的改善。

如果相关的话,我正在使用Mac OS X。

更新:事实证明,我.zshenv文件中的这一行代码是导致它变慢的原因:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

如果我注释掉那一行,它需要大约1秒钟的时间而不是3秒钟。不幸的是,我需要那一行,因为我的许多项目都使用RVM。我现在不知道该怎么办了。

更新2: 这似乎是一个特定于 oh-my-zsh 的问题。如果我不加载 ~/.oh-my-zsh/oh-my-zsh.sh,我就没有问题。


1
如果你现在使用bash,它还是很慢吗? - nneonneo
如果您将~/.z*文件移出路径,速度是否仍然很慢? - user4815162342
不是的。我猜想问题出在其中一个地方。 - Jason Swett
4
如果代码库很大,在每次调用git st时可能会拖慢Shell的速度。使用这个选项来关闭它。 git config --add oh-my-zsh.hide-status 1 - Senthil Kumar
顺便提一下,这也发生在Windows上的WSL和Oh My Zsh上。 - MEMark
显示剩余4条评论
14个回答

422

您可以将此添加到您的git配置中,这样zsh就不会再检查状态了

git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1

说明

lib/git.zsh 中有两个核心的 git 函数:

  • git_prompt_info()
  • parse_git_dirty()

每个方法都有一个 git 配置开关来禁用它:

  • oh-my-zsh.hide-status
  • oh-my-zsh.hide-dirty

一些主题会创建自己的 git 查询,有时会忽略这些标志


4
这个解决方案仍然可用,我刚在我的Symfony2项目文件夹中尝试了一下。也许vendor文件夹会使事情变慢,就像rake文件夹对rails应用程序一样?现在zsh很快,而且我不需要GIT zsh插件。谢谢! - mblaettermann
1
这完美地解决了我的问题。我仍然可以在其他存储库中使用很好的git状态,但在我的巨大的Firefox源代码存储库中,git速度很慢。 - Leo Ufimtsev
2
在全局设置中使用 --global 对于 Vagrant VirtualBox VMs 来说非常方便(在客户机上较慢,在主机上较快),如此描述:https://dev59.com/NWcs5IYBdhLWcg3wiEmK#40943155 <3 - GabLeRoux
41
git config --add oh-my-zsh.hide-dirty 1 这一条命令就足以解决我那个缓慢的代码仓库的问题了。 - Johnathan Elmore
2
这个命令让我立刻感到轻松! - Eduardo
显示剩余8条评论

59

由于在每个命令后检查存储库的状态,因此对于某些存储库而言,Oh_my_zsh似乎速度较慢。

这种行为可以在新版本的.oh_my_zsh中覆盖。

只需取消注释.zshrc文件中的以下行:

DISABLE_UNTRACKED_FILES_DIRTY="true"

完成后,请重新启动终端或运行以下命令:

source ~/.zshrc


6
git config --add oh-my-zsh.hide-status 1 可以提高速度,但会完全移除 VCS 的 zsh 状态。而这个命令可以保留状态并加快速度。 - nyxz
4
我本以为这样做可以解决问题,但即使在执行了source ~/.zshrc之后也没有效果。不过,git config --add oh-my-zsh.hide-dirty 1 对我有用。如果要禁用所有仓库的该功能,请使用 git config --global --add oh-my-zsh.hide-dirty 1 - Johnathan Elmore
1
@JohnathanElmore @Peeyush,DISABLE_UNTRACKED_FILES_DIRTY="true"oh-my-zsh.hide-dirty设置虽然相似,但并不是同一件事。请参见此处的代码:https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17。`DISABLE_UNTRACKED_FILES_DIRTY`设置只是向`git status命令添加了一个--untracked-files=no标志,而oh-my-zsh.hide-dirty 1设置将完全跳过整个git status`命令。我建议采用@JohnathanElmore的全局git配置设置。 - stwr667
3
在我的 Mac M1 上,对于大型文件仓库无法工作。 - Sinux

26

对于我来说,在VirtualBox上(即客户机)运行速度很慢,因为我使用的是同步文件夹。我仍然希望在OS X上(即主机)启用它,因为那里的速度足够快。我不使用本地配置设置,因为它会存储在仓库中并且会同时更改客户机和主机上的设置,而是只在客户机上使用全局配置设置:

git config --global --add oh-my-zsh.hide-dirty 1
如果我只想为单个存储库使用它:
git config --add oh-my-zsh.hide-dirty 1

21

可能是主题在每次输入命令后都调用了git和rvm等内容。

对我来说,将ZSH_THEME="juanghurtadoto"更改为ZSH_THEME="miloshadzic"完全消除了每个命令后的2秒延迟。

可以在https://github.com/robbyrussell/oh-my-zsh/wiki/themes找到主题。


有趣。+1。这比我的回答更具体。 - VonC

13

那些东西帮助了我,因为它让我开始注释掉一些内容,以查看可能使加载速度更快的内容。我进一步缩小了问题范围并更新了我的问题。 - Jason Swett
compinit的帖子对我有所改善,但是删除parse_git_dirty确实加快了速度。谢谢。 - Raj

10

对于其他想要提高他们的zsh git响应速度的人,以下操作可以将我的延迟从40ms降低到4ms

  1. Compile and install an optimized git-branch-name command:

    git clone https://github.com/notfed/git-branch-name
    cd git-branch-name
    make
    sudo install git-branch-name /usr/local/bin/
    
  2. Add this to your ~/.zshrc:

    function git_prompt_info() {
        ref=$(git-branch-name -q -h 12 -b 64) || return
        echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref}${ZSH_THEME_GIT_PROMPT_CLEAN}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
    }
    
-h-b开关分别控制分支名称和哈希值的截断长度。)
有了这个,我可以一直按住回车键而不会遇到任何延迟。

通过这个,我能够创建一个快速的具备 git 意识的 shell 提示符,包含:export PS1="\u@\h \t \W [$txtcyn]$(git-branch-name) [$txtrst]$ " - rangfu

6

我终于想通了。我的项目中有一个rake文件夹,里面有很多文件(大约20,000个)。我不知道那个文件夹是干什么用的,但我把它删除了,Zsh不再缓慢,我的应用程序似乎还能正常工作。


有趣的反馈(比我的答案更精确)+1 - VonC
6
只用了4个月我就搞明白了! - Jason Swett
我觉得这很快啊!我知道有人要花上好几年的时间才能做到;) http://meta.stackexchange.com/questions/36318/whats-the-longest-interval-between-an-answer-being-posted-and-accepted#comment469716_36318 - VonC

5
顶部解决方案提出:
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1

这种方法可以使Git正常运行,但会禁用一些很酷的功能,例如分支名称和脏数据检查。 对我而言,有效的方法是使用aggressive选项来压缩Git数据库:

git gc --aggressive

这个对我有用,谢谢!< git config --add oh-my-zsh.hide-dirty 1 > - Hackeron

3
我曾遇到相同的问题。我运行了以下命令来获取未使用硬编码git插件的所有主题列表:
grep --files-without-match "git" ~/.oh-my-zsh/themes/*
提示符变得更快了,但我不喜欢这些主题。
最终我选择了powerline10k,它可以配置得非常漂亮,而且没有速度问题。

3
如果你只关心 git 而不是其他版本控制程序,那么你可以在你的 *.zsh-theme 中禁用所有的 vcs_info 并用本地的 git 命令替代它们。
例如,我通过以下步骤修改了我的 agnoster.zsh-theme
1. 注释或删除所有包含 vcs_info 的行, 2. 编辑 prompt_git() 函数中的代码,从:

ref="$vcs_info_msg_0_"

修改为

ref="$(git branch 2>/dev/null | grep -Po '(?<=\* ).*$')"

所以,基本上我只是禁用了所有的 vcs_info 操作,并使用原生的 git 命令来检查存储库的状态。结果是,我仍然可以看到有用的 git 提示符,而速度与非 git 目录的工作一样快。通过这个小改动,我的 zsh 在 git 存储库中的工作速度可以提高 4-5 倍。
注意:请使用 GNU 版本的 grep,而不是 BSD 版本的 grep。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接