解决zsh+oh-my-zsh使用主题agnoster时在git目录下缓慢的问题

mac下使用iTerm2终端,安装了zsh shell和oh-my-zsh配置,且使用主题agnoster,日常情况下都很好用没有什么问题,直到进入一个WebRTC大型工程时执行任何命令都非常慢,猜测应该是命令提示符显示了当前目录的git的一些状态,而这个工程的.git太庞大了,所以读取git状态很慢。

网上查找解决办法:

关闭读取git信息

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

开启则将1改为0。

但这个办法相当于完全关闭了命令提示符的git显示功能,无法知道当前git的一些信息,比如我只想知道当前git分支信息,这个信息使用git读取应该是非常快的,而其他git动态信息才是影响速度的关键。

于是自己手动修改on-my-zsh的配置。
一开始修改$ZSH/lib/git.zsh,但使用source ~/.zshrc无法使修改生效。
最后发现git信息读取应该是在当前主题agnoster中被配置。

解决办法


修改$ZSH/themes/agnoster.zsh-theme文件的prompt_git()方法:

prompt_git() {
  (( $+commands[git] )) || return
  if [[ "$(git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then
    return
  fi
  local PL_BRANCH_CHAR
  () {
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    PL_BRANCH_CHAR=$'\ue0a0'         # 
  }
  local ref dirty mode repo_path
  
  if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
    repo_path=$(git rev-parse --git-dir 2>/dev/null)
    dirty=$(parse_git_dirty)
    ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)"
    if [[ -n $dirty ]]; then
      prompt_segment yellow black
    else
      prompt_segment green $CURRENT_FG
    fi

    if [[ -e "${repo_path}/BISECT_LOG" ]]; then
      mode=" "
    elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then
      mode=" >M<"
    elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then
      mode=" >R>"
    fi

    #新增zsh.hide-status配置,不显示一些动态信息,提高速度=================
    if [[ "$(git config --get zsh.hide-status 2>/dev/null)" = 1 ]]; then
        echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${mode}"
      return
    fi
    #=================================================================

    setopt promptsubst
    autoload -Uz vcs_info

    zstyle ':vcs_info:*' enable git
    zstyle ':vcs_info:*' get-revision true
    zstyle ':vcs_info:*' check-for-changes true
    zstyle ':vcs_info:*' stagedstr '✚'
    zstyle ':vcs_info:*' unstagedstr '●'
    zstyle ':vcs_info:*' formats ' %u%c'
    zstyle ':vcs_info:*' actionformats ' %u%c'
    vcs_info
    echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}"
  fi
}

保存后,让配置生效:

source ~/.zshrc

进入工程目录开启配置,只对当前git工程生效:

git config --add zsh.hide-status 1

shell飞快起来了~~~~

你可能感兴趣的:(解决zsh+oh-my-zsh使用主题agnoster时在git目录下缓慢的问题)