156

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

这个让 Zsh 这么慢的 repo 有什么不同呢?我认为这是 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,我没有问题。

4

12 回答 12

312

您可以将其添加到您的 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 查询,有时会忽略这些标志

于 2014-09-16T08:32:23.523 回答
37

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

DISABLE_UNTRACKED_FILES_DIRTY="真"

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

源〜/ .zshrc

于 2016-08-10T06:22:23.207 回答
19

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

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

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

于 2013-01-20T19:10:10.787 回答
19

对我来说,VirtualBox(来宾)很慢,因为我使用的是同步文件夹。我仍然希望它在足够快的 OS X(主机)上启用。我没有使用与 repo 一起存储并在来宾和主机上都更改它的本地配置设置,而是仅在来宾上使用全局配置设置

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

如果我只想要一个回购:

git config --add oh-my-zsh.hide-dirty 1
于 2016-12-03T01:00:02.013 回答
13

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

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

于 2012-10-08T07:49:58.653 回答
6

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

于 2013-02-16T18:54:34.660 回答
5

对于其他希望改善 zsh git 延迟的人来说,以下将我的延迟从 降低40ms4ms

  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标志分别控制分支名称和散列的截断长度。)

有了这个,我可以保持输入并且不会遇到任何滞后。

于 2021-07-03T16:35:46.737 回答
3

如果您不关心其他版本控制程序,但是git,您可以禁用vcs_info您的所有 s并用本机命令*.zsh-theme替换它们。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命令来检查 repo 的状态。结果,我仍然可以看到我有用的 git 提示符,其速度与在非 git 目录中工作一样快。通过这个小修改,我的 zsh 在 git repos 中的运行速度可以提高 4-5 倍。

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

于 2017-12-02T09:51:02.800 回答
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功能。

于 2019-07-15T07:41:11.517 回答
1

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

SPACESHIP_GIT_STATUS_SHOW="false"

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

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

编辑

git 选项的更新链接在这里

于 2020-02-12T17:57:55.687 回答
0

我遇到过同样的问题。我运行以下命令来获取所有未使用硬编码 git 插件的主题的列表:

grep --files-without-match "git" ~/.oh-my-zsh/themes/*

提示变得更快,但我不喜欢这些主题中的任何一个。

我最终使用了 powerline10k,它可以配置为看起来很漂亮并且没有速度问题。

于 2021-11-26T13:02:21.623 回答
0

我想保持我的 git 状态,所以所有其他答案对我没有帮助。

真正帮助我的是在 git 存储库中运行这个对我来说很慢的命令:

git gc

它代表 Garbage Collect 并在此处进行了充分解释,但基本上:

[它] 在当前存储库中运行许多内务处理任务,例如压缩文件修订(以减少磁盘空间并提高性能)

运行此命令后,不再加载。一切又是瞬间的。

于 2021-12-15T00:20:26.723 回答