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
, у меня нет проблемы.
Ответы
Ответ 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
Ответ 3
Существует несколько способов ускорить oh-my-zsh
, как описано в разделе zsh запускается невероятно медленно, очистка раздела плагина.
Например, сообщение в блоге Исправление для oh-my-zsh git -svn prompt slowown упоминает parse_git_dirty
как потенциальная проблема.
Ответ 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, и все работает отлично.