我最近开始使用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
,我就没有问题。
答案 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)
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秒延迟。
答案 4 :(得分:5)
我终于明白了。我的项目有一个rake
文件夹,里面有大量文件(如20,000)。我不知道那个文件夹是什么,但我删除它,Zsh不再慢,我的应用程序似乎仍然有用。
答案 5 :(得分:2)
如果您不关心其他版本控制程序git
,则可以暂停vcs_info
中的所有*.zsh-theme
并将其替换为原生git
}命令。
例如,我通过以下方式调整agnoster.zsh-theme
:
vcs_info
,编辑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。
答案 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
:
编译并安装优化的 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/
将此添加到您的 ~/.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)