Niedawno zacząłem używać Zsh i jest niesamowity. Niestety, w przypadku projektu, który uważam za swój „główny”, wszystko przebiega powoli. Chodzi mi o to, że za każdym razem, gdy wykonuję polecenie - ls
na przykład - występuje około pięciosekundowe opóźnienie między momentem wykonania polecenia a momentem, w którym mogę ponownie użyć terminala.
Co może być innego w tym jednym repozytorium, które sprawia, że Zsh jest tak wolne? Zakładam, że jest to rzecz specyficzna dla Zsh, ponieważ nie było problemu, zanim zacząłem używać Zsh. Próbowałem zrobić, git clean
ale nie zrobiło to żadnej zauważalnej różnicy.
Jestem na Mac OS X, jeśli to ma znaczenie.
Aktualizacja: Okazuje się, że ten wiersz mojego .zshenv
powodu spowalniał:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
Jeśli skomentuję tę linię, zajmie to od około 3 sekund do około 1 sekundy. Niestety potrzebuję tej linii, ponieważ wiele moich projektów korzysta z RVM. Nie wiem, co mam teraz zrobić.
Aktualizacja 2 : wydaje się, że jest to sprawa oh-my-zsh. Jeśli nie ładuję ~/.oh-my-zsh/oh-my-zsh.sh
, nie mam problemu.
~/.z*
pliki z drogi?Odpowiedzi:
Możesz dodać to do swojej konfiguracji git, a zsh nie będzie już sprawdzać statusu
Wyjaśnienie
W lib / git.zsh są dwie główne funkcje git :
git_prompt_info()
parse_git_dirty()
Każda metoda ma przełącznik konfiguracji git, aby ją wyłączyć:
oh-my-zsh.hide-status
oh-my-zsh.hide-dirty
Niektóre motywy tworzą własne zapytania git i czasami ignorują te flagi .
źródło
oh-my-zsh.hide-dirty
. Mogło się zmienić, a może mój motyw (agnoster) tylko szanujehide-dirty
.--global
jest naprawdę przydatne (wolno w trybie gościa, szybko na hoście), jak opisano tutaj: stackoverflow.com/a/40943155/1092815 <3git config --add oh-my-zsh.hide-dirty 1
było wszystkim, czego potrzebowałem do mojego powolnego repo.Oh_my_zsh wydaje się działać wolno w przypadku niektórych repozytoriów, ponieważ po każdym poleceniu sprawdza stan repozytorium. To zachowanie można zmienić w nowej wersji pliku .oh_my_zsh. Po prostu odkomentuj następujący wiersz w .zshrc:
Następnie uruchom ponownie terminal lub wykonaj następujące czynności:
źródło
git config --add oh-my-zsh.hide-status 1
przyspiesza działanie, ale całkowicie usuwa status zsh VCS. Ten utrzymuje go i nadal przyspiesza.git config --add oh-my-zsh.hide-dirty 1
jednak dla mnie zadziałało.git config --global --add oh-my-zsh.hide-dirty 1
aby wyłączyć to dla wszystkich repozytoriów.DISABLE_UNTRACKED_FILES_DIRTY="true"
nie robi tego samego, cooh-my-zsh.hide-dirty
ustawienie, mimo że są podobne. Zobacz kod tutaj: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . ToDISABLE_UNTRACKED_FILES_DIRTY
ustawienie po prostu dodaje--untracked-files=no
flagę dogit status
polecenia, podczas gdyoh-my-zsh.hide-dirty 1
ustawieniegit status
całkowicie pominie całe polecenie. Polecam sugestię @ JohnathanElmore dotyczącą globalnych ustawień konfiguracji git.Może to być motyw wywołujący git i rvm po każdym poleceniu.
U mnie zmiana
ZSH_THEME="juanghurtadoto"
naZSH_THEME="miloshadzic"
całkowite usunięcie 2-sekundowego opóźnienia po każdym poleceniu.Motywy można znaleźć na https://github.com/robbyrussell/oh-my-zsh/wiki/themes
źródło
Dla mnie jest wolny na VirtualBox (gość), ponieważ używam zsynchronizowanego folderu. Nadal chcę, aby był włączony w systemie OS X (host), gdzie jest wystarczająco szybki. Zamiast korzystać z lokalnych ustawień konfiguracyjnych, które są przechowywane w repozytorium i zmieniłyby je zarówno na gościu, jak i na hoście, używam globalnych ustawień konfiguracyjnych tylko dla gościa :
Jeśli chcę tego tylko dla jednego repozytorium:
źródło
Istnieją różne sposoby na przyspieszenie procesu
oh-my-zsh
, jak opisano szczegółowo w sekcji „ zsh uruchamia się niezwykle wolno ”, czyszcząc sekcję dotyczącą wtyczek.Na przykład w poście na blogu „ Naprawa powolnego działania zachęty oh-my-zsh git-svn ” wspomniano o tej
parse_git_dirty
funkcji jako potencjalnym problemie.źródło
W końcu to rozgryzłem. Mój projekt miał
rake
folder z mnóstwem plików (około 20 000). Nie mam pojęcia, do czego służył ten folder, ale usunąłem go, Zsh nie jest już wolny, a moja aplikacja nadal działa.źródło
Jeśli nie obchodzą Cię inne programy do kontroli wersji, ale
git
możesz po prostu wyłączyć wszystkievcs_info
pliki w swoim*.zsh-theme
i zastąpić je natywnymigit
poleceniami.Na przykład poprawiam moje
agnoster.zsh-theme
przez:vcs_info
,edytuj kod w
prompt_git()
funkcji z:ref="$vcs_info_msg_0_"
doref="$(git branch 2>/dev/null | grep -Po '(?<=\* ).*$')"
Zasadniczo po prostu wyłączyłem wszystkie
vcs_info
akcje i zamiast tego użyłem natywnegogit
polecenia do sprawdzania statusów repozytorium. W rezultacie nadal widzę mój przydatny znak zachęty git z szybkością równą pracy w katalogu innym niż git. Dzięki tej niewielkiej modyfikacji mój zsh może działać 4-5x szybciej w repozytoriach git.Uwaga: użyj GNU grep, a nie BSD grep.
źródło
Powyższe odpowiedzi nie rozwiązały mojego problemu. W moim przypadku funkcja
git_prompt_status
zajmuje zbyt dużo czasu niż inne. Więc zmodyfikowałem ~ / .oh-my-zsh / lib / git.zsh, zastępującgit_prompt_status
funkcję moją wczesną wersją zwrotną:Chociaż używam ZSH_THEME_GIT_PROMPT_MODIFIED jako oznaczenia nieokreślonego, możesz wybrać dowolny status, który chcesz, aby to wskazać lub zaimplementować znacznie szybszą
git_prompt_status
funkcję w swoim przypadku.źródło
Dla każdego, kto używa motywu statku kosmicznego, dodaj to do
.zshrc
:pracował dla mnie. Oczywiście utracisz status git w monicie terminala.
Opcje git dla tego motywu można znaleźć tutaj
źródło