163 votes

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 qu'à chaque fois que je lance une commande - ls 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 dans ce repo qui rend Zsh si lent ? Je suppose que c'est un truc spécifique à Zsh car il n'y avait pas de problème avant que je commence à utiliser Zsh. J'ai essayé de faire un git clean mais ça n'a pas fait de différence notable.

Je suis sur Mac OS X si cela compte.

Mise à jour : Il s'avère que cette ligne de mon .zshenv est ce qui le rendait lent :

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

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

Mise à jour 2 Il semble que ce soit spécifiquement un truc de oh-my-zsh. Si je ne charge pas ~/.oh-my-zsh/oh-my-zsh.sh je n'ai pas de problème.

8voto

notfed Points 3180

Pour les autres personnes qui viennent à cette question et qui cherchent à améliorer la latence de leur zsh git, ce qui suit a réduit ma latence de 40ms a 4ms :

  1. Compilez et installez une version optimisée de git-branch-name commandement :

    git clone https://github.com/notfed/git-branch-name
    cd git-branch-name
    make
    sudo install git-branch-name /usr/local/bin/
  2. Ajoutez ceci à votre ~/.zshrc :

    function git_prompt_info() {
        ref=$(git-branch-name -q -h 12 -b 64) || return
        echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref}${ZSH_THEME_GIT_PROMPT_CLEAN}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
    }

(Le -h y -b contrôlent la longueur de la troncature pour les noms de branches et les hachages, respectivement).

Avec cela, je peux maintenir la saisie et ne pas avoir de décalage.

6voto

Jason Swett Points 8368

J'ai enfin compris. Mon projet avait un rake avec une tonne de fichiers (environ 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.

3voto

fronthem Points 2079

Si vous ne vous souciez pas d'un autre programme de contrôle de version mais que git vous pouvez simplement désactiver toutes les vcs_info dans votre *.zsh-theme et les remplacer par des git des commandes.

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

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

    ref="$vcs_info_msg_0_" à

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

Donc, en gros, j'ai juste désactivé tous vcs_info et utiliser à la place une action native git pour vérifier les statuts du repo. 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 travailler 4 à 5 fois plus vite dans les dépôts git.

Note : utilisez GNU grep et non BSD grep.

2voto

Harpal Points 1834

Pour toute personne utilisant le vaisseau spatial ajouter ce thème à .zshrc :

SPACESHIP_GIT_STATUS_SHOW="false"

a fonctionné pour moi. Évidemment, vous perdrez le statut git dans votre invite de terminal.

Les options git pour ce thème sont les suivantes aquí

Edits

Le lien mis à jour vers les options git est aquí

1voto

Xavier.S Points 199

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 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étermination, vous pouvez choisir n'importe quel statut que vous souhaitez pour indiquer cela ou mettre en œuvre une méthode beaucoup plus rapide. git_prompt_status dans votre cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X