Подтвердить что ты не робот

Oh-my-zsh slow, но только для определенного Git репо

Недавно я начал использовать Zsh, и это было потрясающе. К сожалению, для проекта я считаю свой "основной" проект, все идет медленно. Я имею в виду, что каждый раз, когда я запускаю команду - ls, например, там около пяти секундной задержки между временем выполнения команды и временем, когда я могу снова использовать терминал.

Что может быть отличным в этом репо, что делает Zsh настолько медленным? Я предполагаю, что это специфичная для Zsh вещь, потому что не было никаких проблем, прежде чем я начал использовать Zsh. Я попытался сделать git clean, но это не имело заметной разницы.

Я нахожусь в Mac OS X, если это имеет значение.

Обновление: Оказывается, эта строка моего .zshenv - это то, что делало это медленнее:

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

Если я прокомментирую эту строку, это займет от 3 секунд до 1 секунды. К сожалению, мне нужна эта линия, так как многие из моих проектов используют RVM. Я не знаю, что делать сейчас.

Обновление 2: это, по-видимому, особенная вещь о-мой-zsh. Если я не загружаю ~/.oh-my-zsh/oh-my-zsh.sh, у меня нет проблемы.

4b9b3361

Ответ 1

Вы можете добавить это в свой git config, и zsh больше не будет проверять статус

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

объяснение

В lib/git.zsh есть две центральные функции git:

  • git_prompt_info()
  • parse_git_dirty()

У каждого метода есть переключатель конфигурации git для его отключения:

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

Некоторые темы создают свои собственные запросы git и иногда игнорируют эти флаги.

Ответ 2

Oh_my_zsh кажется медленным для некоторых репо, потому что он проверяет статус репо после каждой команды. Это поведение может быть изменено в новой версии .oh_my_zsh. Просто раскомментируйте следующую строку в .zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "истина"

После этого перезапустите свой терминал или выполните следующее:

источник ~/.zshrc

Ответ 4

Это может быть тема, вызывающая git и rvm после каждой команды.

Для меня изменение ZSH_THEME="juanghurtadoto" на ZSH_THEME="miloshadzic" удалило 2-секундную задержку после каждой команды полностью.

Темы можно найти на https://github.com/robbyrussell/oh-my-zsh/wiki/themes

Ответ 5

Для меня это медленно на VirtualBox (гость), потому что я использую синхронизированную папку. Я все еще хочу, чтобы это было включено на OS X (хост), где это достаточно быстро. Вместо использования локального параметра конфигурации, который хранится в репозитории и который будет изменять его как на гостевой, так и на хостовой машине, я использую глобальный параметр конфигурации только на гостевом:

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

Если я хочу это только для одного репо:

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

Ответ 6

Я, наконец, понял это. Мой проект имел папку rake с тонны файлов (например, 20 000). Я понятия не имею, для чего была эта папка, но я удалил ее, Zsh уже не работает медленнее, и мое приложение все еще работает.

Ответ 7

Если вам не нужны другие программы управления версиями, но git, вы можете просто отключить все vcs_info в своем *.zsh-theme и заменить их на собственные команды git.

Например, я настраиваю agnoster.zsh-theme на:

  • комментарий/удалить все строки с vcs_info,
  • отредактируйте код в prompt_git() из:

    ref="$vcs_info_msg_0_" to

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

Итак, в основном, я просто отключил все действия vcs_info и вместо этого использовал собственную команду git для проверки статусов репо. В результате я все еще могу видеть полезную подсказку git со скоростью, столь же быстрой, как работа в каталоге git. С помощью этой небольшой модификации мой zsh может работать быстрее на 4-5 раз в рамках git repos.

Примечание: используйте GNU grep, а не BSD grep.

Ответ 8

Ответы выше не решили мою проблему. В моем случае функция 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 функцию git_prompt_status в вашем случае.

Ответ 9

Вероятно, самое простое и надежное обходное решение, которое я мог придумать, - просто набрать

bash

Я сделал это в каталоге с моим огромным хранилищем git, и все работает отлично.