oh-my-zsh很慢,但仅适用于某些Git回购


102

我最近开始使用Zsh,它很棒。不幸的是,对于该项目,我认为我的“主要”项目进展缓慢。我的意思是,每次我运行一条命令-ls例如-在执行该命令的时间与我可以再次使用该终端之间大约有五秒钟的延迟。

使得Zsh如此缓慢的这一回购可能有什么不同?我认为这是Zsh特有的东西,因为在开始使用Zsh之前没有问题。我尝试做一个,git clean但是并没有什么明显的区别。

如果有的话,我在Mac OS X上。

更新:事实证明我的这一行.zshenv让它变慢了:

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

如果我评论那条线,它从大约3秒变为大约1秒。不幸的是,我需要那条线,因为我的许多项目都使用RVM。我现在不知道该怎么办。

更新2:这似乎是oh-my-zsh特别的事情。如果我不加载~/.oh-my-zsh/oh-my-zsh.sh,就不会有问题。


1
如果现在使用bash,它仍然很慢吗?
nneonneo 2012年

很好的问题。不,bash很快。
杰森·斯威特

如果将~/.z*文件移开,它仍然很慢吗?
user4815162342 2012年

不,所以我想这是其中之一。
杰森·斯威特

3
如果存储库很大,则每次调用git st可能会使外壳变慢。使用此选项将其关闭。git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Answers:


169

您可以将其添加到您的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 config开关来禁用它:

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

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


4
此解决方案仍然有效,只需在我的Symfony2项目文件夹中尝试过。也许vendor文件夹会使事情变慢,就像Rails文件夹对Rails应用程序所做的那样?zsh现在很快,而且我也不需要GIT zsh插件。谢谢!
mblaettermann

这完美地解决了我的问题。我仍然可以在其他存储库中使用不错的git-status业务,但不能在git变慢的巨大firefox源代码存储库中使用。
Leo Ufimtsev '16

我不得不用oh-my-zsh.hide-dirty。它可能已更改,或者也许我的主题(无知者)仅尊重hide-dirty
本杰明·阿特金

1
在流浪汉虚拟机虚拟机的全局设置中这样做--global非常方便(来宾慢,在主机上快速),如下所述:stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

6
git config --add oh-my-zsh.hide-dirty 1 这是我缓慢回购所需的一切。
Johnathan Elmore

26

Oh_my_zsh对于某些存储库似乎很慢,因为它会在每个命令后检查存储库的状态。在新版本的.oh_my_zsh中,可以覆盖此行为。只需取消注释.zshrc中的以下行:

DISABLE_UNTRACKED_FILES_DIRTY =“ true”

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

源〜/ .zshrc


3
git config --add oh-my-zsh.hide-status 1加快了速度,但它完全删除了VCS的zsh状态。这个保持它并仍在加快速度。
nyxz

1
我希望这可以解决问题,但是即使在源〜/ .zshrc之后也没有效果。 git config --add oh-my-zsh.hide-dirty 1不过为我工作。 git config --global --add oh-my-zsh.hide-dirty 1禁用所有回购。
Johnathan Elmore

@JohnathanElmore @Peeyush,即使设置相似,DISABLE_UNTRACKED_FILES_DIRTY="true"也不会执行与oh-my-zsh.hide-dirty设置相同的操作。在此处查看代码:github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17。该DISABLE_UNTRACKED_FILES_DIRTY设置只是--untracked-files=nogit status命令添加一个标志,而该oh-my-zsh.hide-dirty 1设置将git status完全跳过整个命令。我建议@JohnathanElmore建议使用全局git config设置。
stwr667

13

对我来说,在VirtualBox(来宾)上运行缓慢,因为我使用的是同步文件夹。我仍然希望它在足够快的OS X(主机)上启用。我没有使用存储在仓库中的本地配置设置,而是会在来宾和主机上进行更改,而是仅在来宾上使用全局配置设置

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

如果我只想要一个回购协议:

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


11

有多种加快速度的方法oh-my-zsh,如“ zsh的启动速度非常慢”中所述”中所述,清理插件部分。

例如,博客文章“ oh-my-zsh git-svn提示速度慢的修复”提到该parse_git_dirty功能是一个潜在的问题。


这些东西有所帮助,这使我开始注释掉东西,以查看可能使事情更快加载的原因。我进一步缩小了问题的范围,并更新了我的问题。
杰森·斯威特

compinit的帖子对我来说改善了一点,但是删除parse_git_dirty确实加快了速度。谢谢。
拉吉2013年


3

如果您不在乎其他版本控制程序git,则可以禁用其中的所有vcs_infos*.zsh-theme并将其替换为nativegit命令。

例如,我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 repos中更快地工作4-5倍。

注意:使用GNU grep而不是BSD grep。


1

上面的答案不能解决我的问题。就我而言,该功能git_prompt_status比其他功能花费太多时间。所以我修改了〜/ .oh-my-zsh / lib / git.zsh,用git_prompt_status我的早期返回版本替换了函数:

function git_prompt_status() {
  STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  echo $STATUS
  return

  local INDEX STATUS
  INDEX=$(command git status --porcelain -b 2> /dev/null)
  STATUS=""
  if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^A  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  elif $(echo "$INDEX" | grep '^M  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^R  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  elif $(echo "$INDEX" | grep '^D  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  fi
  if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then
    STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
  fi
  if $(echo "$INDEX" | grep '^## [^ ]\+ .*ahead' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
  fi
  if $(echo "$INDEX" | grep '^## [^ ]\+ .*behind' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
  fi
  if $(echo "$INDEX" | grep '^## [^ ]\+ .*diverged' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
  fi
  echo $STATUS
}

当我将ZSH_THEME_GIT_PROMPT_MODIFIED用作未确定的标记时,您可以选择想要指示的任何状态,或者git_prompt_status在您的情况下实现更快的功能。


0

对于使用宇宙飞船主题的任何人,请将其添加到.zshrc

SPACESHIP_GIT_STATUS_SHOW="false"

为我工作。显然,您将在终端提示符下丢失git状态。

这个主题的git选项可以在这里找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.