oh-my-zsh lent, mais seulement pour certains repo Git

102

J'ai récemment commencé à utiliser Zsh et c'est génial. Malheureusement, pour le projet que je considère comme mon projet "principal", tout est lent. Ce que je veux dire, c'est que chaque fois que j'exécute une commande ls, par exemple, il y a un délai d'environ cinq secondes entre le moment où la commande est exécutée et le moment où je peux à nouveau utiliser le terminal.

Qu'est-ce qui pourrait être différent à propos de ce repo qui rend Zsh si lent? Je suppose que c'est une chose spécifique à Zsh car il n'y avait aucun problème avant de commencer à utiliser Zsh. J'ai essayé de faire un git cleanmais cela n'a fait aucune différence notable.

Je suis sous Mac OS X si cela compte.

Mise à jour: Il s'avère que cette ligne de mon .zshenvest ce qui le ralentissait:

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

Si je commente cette ligne, cela passe d'environ 3 secondes à environ 1 seconde. Malheureusement, j'ai besoin de cette ligne, car beaucoup de mes projets utilisent RVM. Je ne sais pas quoi faire maintenant.

Mise à jour 2 : cela semble être spécifiquement une chose oh-my-zsh. Si je ne charge pas ~/.oh-my-zsh/oh-my-zsh.sh, je n'ai pas de problème.

Jason Swett
la source
1
et si vous utilisez bash maintenant, est-ce encore lent?
nneonneo
Excellente question. Non, c'est rapide sur bash.
Jason Swett
Est-ce encore lent si vous déplacez vos ~/.z*fichiers à l'écart?
user4815162342
Non, donc je suppose que c'est quelque chose dans l'un de ceux-là.
Jason Swett
3
Si le dépôt est gros, appeler git st à chaque fois peut ralentir le shell. Utilisez cette option pour le désactiver. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Réponses:

171

Vous pouvez l'ajouter à votre git config et zsh ne vérifiera plus l'état

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

Explication

Il y a deux fonctions git centrales dans lib / git.zsh :

  • git_prompt_info()
  • parse_git_dirty()

Chaque méthode a un commutateur git config pour la désactiver:

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

Certains thèmes créent leurs propres requêtes git et ignorent parfois ces indicateurs .

Pascalius
la source
4
Cette solution fonctionne toujours, j'ai juste essayé ceci dans mon dossier de projet Symfony2. Peut-être que le dossier du fournisseur ralentit les choses, comme le dossier rake le fait pour les applications de rails? zsh est rapide maintenant, et je n'ai de toute façon pas besoin du plugin GIT zsh. Merci!
mblaettermann
Cela a parfaitement résolu mon problème. Je peux toujours utiliser la belle entreprise git-status dans d'autres dépôts, mais pas dans mon énorme dépôt de code source Firefox où git lentement.
Leo Ufimtsev
1
Je devais utiliser oh-my-zsh.hide-dirty. Cela pourrait avoir changé ou peut-être que mon thème (agnoster) ne respecte que hide-dirty.
Benjamin Atkin
1
Faire cela dans les paramètres globaux pour vagrant virtualbox vms avec --globalest vraiment pratique (lent en invité, rapide sur l'hôte) comme décrit ici: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux
6
git config --add oh-my-zsh.hide-dirty 1était tout ce dont j'avais besoin pour mon repo lent.
Johnathan Elmore
26

Oh_my_zsh semble être lent pour certains dépôts car il vérifie l'état du dépôt après chaque commande. Ce comportement peut être remplacé dans la nouvelle version de .oh_my_zsh. Décommentez simplement la ligne suivante dans .zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "vrai"

Après cela, redémarrez votre terminal ou exécutez ce qui suit:

source ~ / .zshrc

Peeyush Goela
la source
3
git config --add oh-my-zsh.hide-status 1accélère les choses mais supprime complètement l'état zsh du VCS. Celui-ci le garde et l'accélère toujours.
nyxz le
1
J'espérais que cela ferait l'affaire, mais aucun effet, même après la source ~ / .zshrc. git config --add oh-my-zsh.hide-dirty 1a fonctionné pour moi, cependant. git config --global --add oh-my-zsh.hide-dirty 1pour désactiver cela pour tous les dépôts.
Johnathan Elmore
@JohnathanElmore @Peeyush, DISABLE_UNTRACKED_FILES_DIRTY="true"ne fait pas la même chose que le oh-my-zsh.hide-dirtyparamètre, même s'ils sont similaires. Voir le code ici: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . Le DISABLE_UNTRACKED_FILES_DIRTYparamètre ajoute simplement un --untracked-files=noindicateur à la git statuscommande, tandis que le oh-my-zsh.hide-dirty 1paramètre ignore complètement la git statuscommande entière . Je recommande la suggestion de @ JohnathanElmore concernant le paramètre global git config.
stwr667
13

Pour moi, c'est lent sur VirtualBox (l'invité) car j'utilise un dossier synchronisé. Je veux toujours qu'il soit activé sur OS X (l'hôte) où il est assez rapide. Au lieu d'utiliser un paramètre de configuration local qui est stocké avec le repo et le changerait à la fois sur l'invité et l'hôte, j'utilise un paramètre de configuration global uniquement sur l'invité :

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

Si je le veux juste pour un seul repo:

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

Cela pourrait être le thème appelant les trucs git et rvm après chaque commande.

Pour moi, changer ZSH_THEME="juanghurtadoto"pour ZSH_THEME="miloshadzic"supprimer le délai de 2 secondes après chaque commande complètement.

Les thèmes peuvent être trouvés sur https://github.com/robbyrussell/oh-my-zsh/wiki/themes

James EJ
la source
Intéressant. +1. C'est plus précis que ma réponse.
VonC
11

Il existe différentes façons d'accélérer oh-my-zsh, comme détaillé dans " zsh démarre incroyablement lentement ", en nettoyant la section plugin.

Par exemple, le billet de blog « Correction de la lenteur de l'invite oh-my-zsh git-svn » mentionne la parse_git_dirtyfonction comme un problème potentiel.

VonC
la source
Cela m'a aidé en ce sens que cela m'a amené à commencer à commenter des choses pour voir ce qui pourrait accélérer le chargement. J'ai réduit davantage le problème et mis à jour ma question.
Jason Swett
Le post compinit a amélioré un peu pour moi, mais la suppression de parse_git_dirty a vraiment accéléré les choses. Merci.
Raj
6

J'ai finalement compris. Mon projet avait un rakedossier avec une tonne de fichiers (comme 20 000). Je n'ai aucune idée de la raison pour laquelle ce dossier était là, mais je l'ai supprimé, Zsh n'est plus lent et mon application semble toujours fonctionner.

Jason Swett
la source
Commentaires intéressants (plus précis que ma réponse) +1
VonC
5
Et il ne m'a fallu que 4 mois pour comprendre!
Jason Swett
Je trouve ça vite! Je connais des gens qui prennent plusieurs années ;) meta.stackexchange.com/questions/36318
...
3

Si vous ne vous souciez pas d'un autre programme de contrôle de version git, vous pouvez simplement désactiver tous les vcs_infos de votre *.zsh-themeet les remplacer par des gitcommandes natives .

Par exemple, je peaufine mon agnoster.zsh-themepar:

  1. commenter / supprimer toutes les lignes qui ont vcs_info,
  2. éditer le code en prompt_git()fonction de:

    ref="$vcs_info_msg_0_" à

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

Donc, fondamentalement, je viens de désactiver toutes les vcs_infoactions et d'utiliser à la place une gitcommande native pour vérifier les statuts du dépôt. En conséquence, je peux toujours voir mon invite git utile avec une vitesse aussi rapide que de travailler dans un répertoire non git. Avec cette petite modification, mon zsh peut fonctionner 4 à 5 fois plus rapidement dans les dépôts git.

Remarque: utilisez GNU grep et non BSD grep.

fronthem
la source
1

Les réponses ci-dessus n'ont pas résolu mon problème. Dans mon cas, la fonction git_prompt_statusprend trop de temps que les autres. J'ai donc modifié ~ / .oh-my-zsh / lib / git.zsh, en remplaçant git_prompt_statusfunction par ma version de retour anticipé:

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
}

Bien que j'utilise ZSH_THEME_GIT_PROMPT_MODIFIED comme une marque d'indéterminé, vous pouvez choisir n'importe quel statut que vous souhaitez pour l'indiquer ou implémenter une git_prompt_statusfonction beaucoup plus rapide dans votre cas.

Xavier.S
la source
0

Pour toute personne utilisant le thème du vaisseau spatial, ajoutez ceci à .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

travaillé pour moi. De toute évidence, vous perdrez le statut git dans l'invite de votre terminal.

Les options git pour ce thème peuvent être trouvées ici

Harpal
la source