web-dev-qa-db-fra.com

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

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 réutiliser le terminal.

Qu'est-ce qui pourrait être différent dans ce dépôt 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 clean mais cela n'a pas fait de différence notable.

Je suis sur Mac OS X, si cela importe.

pdate: Il s'avère que cette ligne de mon .zshenv est ce qui ralentissait:

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

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

pdate 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 le problème.

67
Jason Swett

Vous pouvez l'ajouter à votre configuration git 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 centrales de git dans in lib/git.zsh :

  • git_Prompt_info()
  • parse_git_dirty()

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

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

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

107
Pascalius

Oh_my_zsh semble être lent pour certains repos 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 = "true"

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

source ~/.zshrc

12
Peeyush Goela

Il pourrait s'agir du thème appelant des trucs git et rvm après chaque commande.

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

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

11
James EJ

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

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

10
VonC

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 dépôt 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
7
Benjamin Atkin

Je l'ai finalement compris. Mon projet avait un dossier rake avec une tonne de fichiers (comme 20 000). Je ne sais pas à quoi servait ce dossier, mais je l'ai supprimé, Zsh n'est plus lent et mon application semble toujours fonctionner.

5
Jason Swett

Si vous ne vous souciez pas d'un autre programme de contrôle de version mais git, vous pouvez simplement désactiver tous les vcs_info Dans votre *.zsh-theme Et les remplacer par git natif commandes.

Par exemple, je modifie mon agnoster.zsh-theme En:

  1. commenter/supprimer toutes les lignes contenant vcs_info,
  2. éditez le code dans la fonction Prompt_git() à partir de:

    ref="$vcs_info_msg_0_" À

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

Donc, fondamentalement, je viens de désactiver toutes les actions vcs_info, Et d'utiliser à la place une commande native git pour vérifier les états 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 git repos.

Remarque: utilisez GNU grep et non BSD grep.

2
fronthem

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

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 marque indéterminée, vous pouvez choisir n'importe quel état que vous souhaitez indiquer ou mettre en œuvre un _ beaucoup plus rapide git_Prompt_status fonctionne dans votre cas.

1
Xavier.S