oh-my-zsh langsam, aber nur für bestimmte Git Repo

97

Ich habe vor kurzem angefangen, Zsh zu benutzen und es ist großartig. Leider ist für das Projekt, das ich als mein "Hauptprojekt" betrachte, alles langsam. Was ich meine ist, dass jedes Mal, wenn ich einen Befehl ausführe -ls zum Beispiel - zwischen der Ausführung des Befehls und der Zeit, zu der ich das Terminal wieder verwenden kann, eine Verzögerung von etwa fünf Sekunden liegt.

Was könnte anders an diesem einen Repo sein, das Zsh so langsam macht? Ich nehme an, es ist eine Zsh-spezifische Sache, da es kein Problem gab, bevor ich anfing, Zsh zu verwenden. Ich habe versucht, einegit clean aber es machte keinen merklichen Unterschied.

Ich bin unter Mac OS X, wenn das wichtig ist.

Update: Es stellt sich heraus, dass diese Zeile meine .zshenvlangsam gemacht hat:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

Wenn ich diese Zeile kommentiere, dauert es ungefähr 3 Sekunden bis ungefähr 1 Sekunde. Leider brauche ich diese Leitung, da viele meiner Projekte RVM verwenden. Ich weiß jetzt nicht, was ich tun soll.

Update 2 : Dies scheint speziell eine Oh-My-Zsh-Sache zu sein. Wenn ich nicht lade ~/.oh-my-zsh/oh-my-zsh.sh, habe ich kein Problem.

Jason Swett
quelle
1
und wenn Sie jetzt Bash verwenden, ist es immer noch langsam?
Nneonneo
Ausgezeichnete Frage. Nein, es geht schnell.
Jason Swett
Ist es immer noch langsam, wenn Sie Ihre ~/.z*Dateien aus dem Weg räumen?
user4815162342
Also denke ich, es ist etwas in einem von denen.
Jason Swett
3
Wenn das Repo groß ist, kann das Aufrufen von git st jedes Mal die Shell verlangsamen. Verwenden Sie diese Option, um sie auszuschalten. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Antworten:

165

Sie können dies zu Ihrer Git-Konfiguration hinzufügen und zsh überprüft den Status nicht mehr

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

Erläuterung

In lib / git.zsh gibt es zwei zentrale Git-Funktionen :

  • git_prompt_info()
  • parse_git_dirty()

Jede Methode verfügt über einen Git-Konfigurationsschalter, um sie zu deaktivieren:

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

Einige Themen erstellen ihre eigenen Git-Abfragen und ignorieren diese Flags manchmal .

Pascalius
quelle
4
Diese Lösung funktioniert immer noch. Versuchen Sie es einfach in meinem Symfony2-Projektordner. Vielleicht macht der Vendor-Ordner die Dinge langsam, wie es der Rake-Ordner für Rails-Apps tut? zsh ist jetzt schnell und ich brauche das GIT zsh Plugin sowieso nicht. Vielen Dank!
mblaettermann
Dies hat mein Problem perfekt gelöst. Ich kann das nette Git-Status-Geschäft immer noch in anderen Repos verwenden, aber nicht in meinem riesigen Firefox-Quellcode-Repo, wo es langsam ist.
Leo Ufimtsev
Ich musste benutzen oh-my-zsh.hide-dirty. Es könnte sich geändert haben oder vielleicht respektiert mein Thema (Agnoster) nur hide-dirty.
Benjamin Atkin
1
Dies in globalen Einstellungen für vagabundierende Virtualbox-VMs mit zu tun, --globalist sehr praktisch (langsam im Gast, schnell auf dem Host), wie hier beschrieben: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux
5
git config --add oh-my-zsh.hide-dirty 1war alles was ich für mein langsames Repo brauchte.
Johnathan Elmore
23

Oh_my_zsh scheint für einige Repos langsam zu sein, da es den Status des Repos nach jedem Befehl überprüft. Dieses Verhalten kann in der neuen Version von .oh_my_zsh überschrieben werden. Kommentieren Sie einfach die folgende Zeile in .zshrc aus:

DISABLE_UNTRACKED_FILES_DIRTY = "true"

Starten Sie danach Ihr Terminal neu oder führen Sie Folgendes aus:

Quelle ~ / .zshrc

Peeyush Goela
quelle
3
git config --add oh-my-zsh.hide-status 1beschleunigt die Dinge, entfernt aber den zsh-Status des VCS vollständig. Dieser behält es und beschleunigt es immer noch.
Nyxz
1
Ich hatte gehofft, dass dies den Trick machen würde, aber keine Wirkung, selbst nach Quelle ~ / .zshrc. git config --add oh-my-zsh.hide-dirty 1hat aber für mich gearbeitet. git config --global --add oh-my-zsh.hide-dirty 1um dies für alle Repos zu deaktivieren.
Johnathan Elmore
@JohnathanElmore @Peeyush, DISABLE_UNTRACKED_FILES_DIRTY="true"macht nicht dasselbe wie die oh-my-zsh.hide-dirtyEinstellung, obwohl sie ähnlich sind. Den Code finden Sie hier: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . Die DISABLE_UNTRACKED_FILES_DIRTYEinstellung fügt --untracked-files=nodem git statusBefehl einfach ein Flag hinzu , während die oh-my-zsh.hide-dirty 1Einstellung den gesamten git statusBefehl insgesamt überspringt . Ich empfehle @ JohnathanElmores Vorschlag für die globale Git-Konfigurationseinstellung.
stwr667
13

Für mich ist es auf VirtualBox (dem Gast) langsam, weil ich einen synchronisierten Ordner verwende. Ich möchte immer noch, dass es unter OS X (dem Host) aktiviert wird, wo es schnell genug ist. Anstatt eine lokale Konfigurationseinstellung zu verwenden, die im Repo gespeichert ist und diese sowohl auf dem Gast als auch auf dem Host ändern würde, verwende ich eine globale Konfigurationseinstellung nur für den Gast :

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

Wenn ich es nur für ein einziges Repo will:

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

Es könnte das Thema sein, das nach jedem Befehl Git- und RVM-Zeug aufruft.

Für mich wechseln ZSH_THEME="juanghurtadoto"zuZSH_THEME="miloshadzic" die Verzögerung von 2 Sekunden nach jedem Befehl vollständig entfernt.

Themen finden Sie unter https://github.com/robbyrussell/oh-my-zsh/wiki/themes

James EJ
quelle
Interessant. +1. Dies ist spezifischer als meine Antwort.
VonC
11

Es gibt verschiedene Möglichkeiten, eine zu beschleunigen oh-my-zsh, wie in " zsh beginnt beginnt unglaublich langsam , um den Plugin-Bereich zu " beschrieben.

Zum Beispiel erwähnt der Blog-Beitrag " Fix für die Langsamkeit der Eingabeaufforderung von oh-my-zsh git-svn " die parse_git_dirtyFunktion als potenzielles Problem.

VonC
quelle
Dieses Zeug hat mir geholfen, Dinge zu kommentieren, um zu sehen, was das Laden von Dingen beschleunigen könnte. Ich habe das Problem weiter eingegrenzt und meine Frage aktualisiert.
Jason Swett
Der Compinit-Beitrag hat sich für mich ein wenig verbessert, aber das Entfernen von parse_git_dirty hat die Dinge wirklich beschleunigt. Vielen Dank.
Raj
6

Ich habe es endlich herausgefunden. Mein Projekt hatte einen rakeOrdner mit einer Menge Dateien (wie 20.000). Ich habe keine Ahnung, wofür dieser Ordner da war, aber ich habe ihn gelöscht, Zsh ist nicht mehr langsam und meine App scheint immer noch zu funktionieren.

Jason Swett
quelle
Interessantes Feedback (genauer als meine Antwort) +1
VonC
5
Und ich habe nur 4 Monate gebraucht, um das herauszufinden!
Jason Swett
Ich finde das schnell! Ich kenne jemanden, der mehrere Jahre braucht
VonC
3

Wenn Sie sich nicht für andere Versionskontrollprogramme interessieren git, können Sie einfach alle vcs_infos in Ihrem Programm deaktivieren *.zsh-themeund durch native gitBefehle ersetzen .

Zum Beispiel optimiere ich meine agnoster.zsh-themedurch:

  1. kommentieren / entfernen Sie alle Zeilen, die haben vcs_info,
  2. Code in prompt_git()Funktion bearbeiten von:

    ref="$vcs_info_msg_0_" zu

    ref="$(git branch 2>/dev/null | grep -Po '(?<=\* ).*$')"

Im Grunde habe ich einfach alle vcs_infoAktionen deaktiviert und stattdessen einen nativen gitBefehl zum Überprüfen des Status des Repos verwendet. Infolgedessen kann ich meine nützliche Git-Eingabeaufforderung immer noch mit einer Geschwindigkeit sehen, die so schnell ist wie die Arbeit in einem Nicht-Git-Verzeichnis. Mit dieser kleinen Modifikation kann mein zsh in Git-Repos 4-5x schneller arbeiten.

Hinweis: Verwenden Sie GNU grep und nicht BSD grep.

fronthem
quelle
1

Die obigen Antworten haben mein Problem nicht gelöst. In meinem Fall nimmt die Funktion git_prompt_statuszu viel Zeit in Anspruch als andere. Also habe ich ~ / .oh-my-zsh / lib / git.zsh geändert und die git_prompt_statusFunktion durch meine frühe Rückkehrversion ersetzt:

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
}

Während ich ZSH_THEME_GIT_PROMPT_MODIFIED als Zeichen für Unbestimmtes verwende, können Sie einen beliebigen Status auswählen, um dies anzuzeigen, oder git_prompt_statusin Ihrem Fall eine viel schnellere Funktion implementieren .

Xavier.S
quelle
0

Für alle, die das Raumschiff- Thema verwenden, fügen Sie Folgendes hinzu .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

arbeitete für mich. Offensichtlich verlieren Sie den Git-Status in Ihrer Terminal-Eingabeaufforderung.

Die Git-Optionen für dieses Thema finden Sie hier

Harpal
quelle