web-dev-qa-db-ja.com

oh-my-zshは遅いが、特定のGitリポジトリのみ

私は最近Zshを使い始めましたが、それは素晴らしいです。残念ながら、私が「メイン」プロジェクトと考えるプロジェクトでは、すべてが遅いです。つまり、コマンドを実行するたびに(たとえば、ls)、コマンドが実行されてから端末を再び使用できるようになるまでに約5秒の遅延があります。

Zshを非常に遅くするこの1つのレポについて何が違うのでしょうか? 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をロードしない場合、問題はありません。

67
Jason Swett

これをgit configに追加すると、zshはステータスをチェックしなくなります

_git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
_

説明

lib/git.zsh には、2つの中心的なgit関数があります。

  • git_Prompt_info()
  • parse_git_dirty()

各メソッドには、無効にするためのgit configスイッチがあります。

  • _oh-my-zsh.hide-status_
  • _oh-my-zsh.hide-dirty_

一部のテーマは独自のgitクエリを作成し、場合によっては これらのフラグを無視 にします。

107
Pascalius

Oh_my_zshは、各コマンドの後にリポジトリのステータスをチェックするため、一部のリポジトリでは遅いようです。この動作は、新しいバージョンの.oh_my_zshでオーバーライドできます。 .zshrcの次の行のコメントを外します。

DISABLE_UNTRACKED_FILES_DIRTY = "true"

この後、ターミナルを再起動するか、次を実行します。

ソース〜/ .zshrc

12
Peeyush Goela

コマンドごとにgitやrvmを呼び出すテーマにすることもできます。

私にとっては、ZSH_THEME="juanghurtadoto"からZSH_THEME="miloshadzic"は、すべてのコマンドの後に2秒の遅延を完全に削除しました。

テーマは https://github.com/robbyrussell/oh-my-zsh/wiki/themes で見つけることができます

11
James EJ

oh-my-zshを高速化するさまざまな方法があります。詳細は、「 zshの起動が非常に遅い 」で説明されています。プラグインセクションをクリーンアップします。

たとえば、ブログ投稿「 oh-my-zsh git-svn Prompt slownessの修正 」では、潜在的な問題としてparse_git_dirty関数に言及しています。

10
VonC

私にとっては、VirtualBox(ゲスト)で同期フォルダーを使用しているため低速です。 OS X(ホスト)で十分に高速で有効にしたいのです。リポジトリに保存され、ゲストとホストの両方で変更するローカル構成設定を使用する代わりに、ゲストのみのグローバル構成設定を使用します:

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

単一のレポだけが必要な場合:

git config --add oh-my-zsh.hide-dirty 1
7
Benjamin Atkin

私はついにそれを理解しました。私のプロジェクトには、大量のファイル(20,000など)を含むrakeフォルダーがありました。私はそのフォルダーが何のためにあったのか分かりませんが、削除しました。Zshはもはや遅くなく、私のアプリはまだ動作しているようです。

5
Jason Swett

git以外のバージョン管理プログラムを気にしない場合は、_vcs_info_内のすべての_*.zsh-theme_ sを無効にして、ネイティブの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コマンドを使用してレポのステータスを確認します。その結果、git以外のディレクトリで作業するのと同じ速さで、便利なgitプロンプトを表示できます。この小さな変更により、zshはgitリポジトリ内で4〜5倍速く動作します。

注:use GNU grep not BSD grep。

2
fronthem

上記の回答は私の問題を解決しませんでした。私の場合、関数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あなたの場合の機能。

1
Xavier.S