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


102

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

Zshを非常に遅くするこの1つのリポジトリについて何が違うのでしょうか?Zshを使い始める前は問題がなかったので、これはZsh固有のものだと思います。私はやってみましたgit cleanが、目立った違いはありませんでした。

それが問題なら、私はMac OSXを使用しています。

更新:私のこの行が.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しなくても問題ありません。


1
そして今bashを使用している場合、それはまだ遅いですか?
nneonneo 2012年

すばらしい質問です。いいえ、bashでは高速です。
Jason Swett 2012年

~/.z*ファイルを邪魔にならない場所に移動しても、まだ遅いですか?
user4815162342 2012年

いいえ。それはそのうちの1つにあると思います。
Jason Swett 2012年

3
リポジトリが大きい場合、毎回git stを呼び出すと、シェルの速度が低下する可能性があります。このオプションを使用してオフにします。git config --add oh-my-zsh.hide-status 1
Senthil Kumar

回答:


171

これをgitconfigに追加すると、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()

各メソッドには、それを無効にするためのgitconfigスイッチがあります。

  • oh-my-zsh.hide-status
  • oh-my-zsh.hide-dirty

一部のテーマは独自のgitクエリを作成し、これらのフラグを無視する場合がありますます。


4
このソリューションは引き続き機能します。Symfony2プロジェクトフォルダーでこれを試してみました。たぶん、ベンダーフォルダーは、rakeフォルダーがrailsアプリに対して行うように、物事を遅くしますか?zshは現在高速であり、とにかくGITzshプラグインは必要ありません。ありがとう!
mblaettermann 2015

これは私の問題を完全に解決しました。私はまだ他のリポジトリで素晴らしいgit-statusビジネスを使用できますが、gitが遅い私の巨大なfirefoxソースコードリポジトリでは使用できません。
Leo Ufimtsev 2016

1
私は使用しなければなりませんでしたoh-my-zsh.hide-dirty。変更された可能性があるか、私のテーマ(無視)が尊重するだけかもしれませんhide-dirty
ベンジャミンアトキン2016

1
--globalここで説明されているように、vagrant virtualbox vmsのグローバル設定でこれを行うと非常に便利です(ゲストで遅い、ホストで速い):stackoverflow.com/a/40943155/1092815 <3
GabLeRoux 2017

6
git config --add oh-my-zsh.hide-dirty 1遅いレポに必要なのはそれだけでした。
ジョナサンエルモア

26

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

DISABLE_UNTRACKED_FILES_DIRTY = "true"

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

ソース〜/ .zshrc


3
git config --add oh-my-zsh.hide-status 1処理速度は向上しますが、VCSのzshステータスは完全に削除されます。これはそれを維持し、それでもそれをスピードアップします。
nyxz

1
私はこれでうまくいくことを望んでいましたが、ソース〜/ .zshrcの後でさえ効果はありませんでした。 git config --add oh-my-zsh.hide-dirty 1しかし、私のために働いた。 git config --global --add oh-my-zsh.hide-dirty 1すべてのリポジトリでこれを無効にします。
ジョナサンエルモア

@JohnathanElmore @Peeyushは、類似していてもDISABLE_UNTRACKED_FILES_DIRTY="true"oh-my-zsh.hide-dirty設定と同じことはしません。ここのコードを参照してください:github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17。このDISABLE_UNTRACKED_FILES_DIRTY設定は単にコマンドに--untracked-files=noフラグを追加するだけですがgit statusoh-my-zsh.hide-dirty 1設定はgit statusコマンド全体を完全にスキップします。@JohnathanElmoreによるグローバルなgitconfig設定の提案をお勧めします。
stwr667

13

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

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

単一のリポジトリだけで必要な場合:

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

12

これは、すべてのコマンドの後にgitおよびrvmのものを呼び出すテーマである可能性があります。

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

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


面白い。+1。これは私の答えよりも具体的です。
vonC 2013年

11

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

たとえば、ブログ投稿「oh-my-zsh git-svnプロンプトの速度parse_git_dirty低下の修正」では、この機能が潜在的な問題として言及されています。


そのようなものは、物事がより速くロードされる可能性があるものを確認するためにコメントを書き始めることにつながったという点で役立ちました。問題をさらに絞り込み、質問を更新しました。
Jason Swett 2012年

compinitの投稿は私にとっては少し改善されましたが、parse_git_dirtyを削除すると本当にスピードアップしました。ありがとう。
Raj 2013

6

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


興味深いフィードバック(私の答えよりも正確)+1
VonC 2013

5
そして、それを理解するのにたった4か月しかかかりませんでした!
Jason Swett 2013

私はそれが速いと思います!私はいくつかの取りサムス知っ;)meta.stackexchange.com/questions/36318/...
VonC

3

別のバージョン管理プログラムを気にしないがgit、の場合は、のすべてを無効にして、ネイティブに置き換えることができvcs_infoます。*.zsh-themegitコマンド。

たとえば、次のように調整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倍速く動作できます。

注:BSDgrepではなくGNUgrepを使用してください。


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機能を実装することができます。


0

宇宙船のテーマを使用している人は、これを.zshrc次のように追加してください。

SPACESHIP_GIT_STATUS_SHOW="false"

私のために働いた。明らかに、ターミナルプロンプトでgitステータスが失われます。

このテーマのgitオプションはここにあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.