哦-my-zsh很慢,但只适用于某些Git回购

时间:2012-10-07 01:21:58

标签: git zsh

我最近开始使用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 :这似乎是一个特别的哦 - 我 - zsh的事情。如果我没有加载~/.oh-my-zsh/oh-my-zsh.sh,我就没有问题。

9 个答案:

答案 0 :(得分:100)

您可以将此添加到您的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查询,有时会ignore these flags

答案 1 :(得分:12)

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

  

DISABLE_UNTRACKED_FILES_DIRTY ="真"

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

  

source~ / .zshrc

答案 2 :(得分:10)

有多种方法可以加快oh-my-zsh的速度,详见“zsh starts incredibly slowly”,清理插件部分。

例如,博文“Fix for oh-my-zsh git-svn prompt slowness”提到parse_git_dirty功能是一个潜在的问题。

答案 3 :(得分:9)

这可能是在每个命令之后调用git和rvm的主题。

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

可以在https://github.com/robbyrussell/oh-my-zsh/wiki/themes

找到主题

答案 4 :(得分:5)

我终于明白了。我的项目有一个rake文件夹,里面有大量文件(如20,000)。我不知道那个文件夹是什么,但我删除它,Zsh不再慢,我的应用程序似乎仍然有用。

答案 5 :(得分:2)

如果您不关心其他版本控制程序git,则可以暂停vcs_info中的所有*.zsh-theme并将其替换为原生git }命令。

例如,我通过以下方式调整agnoster.zsh-theme

  1. 评论/删除所有包含vcs_info
  2. 的行
  3. 编辑prompt_git()函数中的代码:

    ref="$vcs_info_msg_0_"

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

  4. 所以,基本上,我只是禁用了所有vcs_info操作,而是使用本机git命令来检查repo的状态。结果,我仍然可以看到我有用的git提示符,速度和在非git目录中一样快。通过这个小修改,我的zsh可以在git repos中快速工作4-5倍。

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

答案 6 :(得分: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功能。

答案 7 :(得分:1)

对于寻求改善 zsh git 延迟的其他人来说,以下将我的延迟从 40ms 减少到 4ms

  1. 编译并安装优化的 git-branch-name 命令:

    git clone https://github.com/notfed/git-branch-name
    cd git-branch-name
    make
    sudo install git-branch-name /usr/local/bin/
    
  2. 将此添加到您的 ~/.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 标志分别控制分支名称和散列的截断长度。)

有了这个,我可以保持输入而不会遇到任何延迟。

答案 8 :(得分:0)

对于使用spaceship主题的任何人,请将其添加到.zshrc

SPACESHIP_GIT_STATUS_SHOW="false"

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

此主题的git选项可以在here

中找到