oh-my-zsh yavaş, ancak yalnızca belirli Git deposu için


102

Son zamanlarda Zsh kullanmaya başladım ve bu harika. Ne yazık ki, proje için "ana" projem olduğunu düşünüyorum, her şey yavaş. Demek istediğim, bir komutu her çalıştırdığımda - lsörneğin - komutun yürütüldüğü zaman ile terminali tekrar kullanabildiğim zaman arasında yaklaşık beş saniyelik bir gecikme oluyor.

Zsh'ı bu kadar yavaş kılan bu tek depoda ne farklı olabilir? Bunun Zsh'a özgü bir şey olduğunu varsayıyorum çünkü Zsh kullanmaya başlamadan önce hiçbir sorun yoktu. Bir yapmayı denedim git cleanama gözle görülür bir fark yaratmadı.

Önemli olursa Mac OS X kullanıyorum.

Güncelleme: Benim bu hat üzerinden dönüşler .zshenvyavaş yapma edildi ki:

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

Bu satıra yorum yaparsam, yaklaşık 3 saniyeden 1 saniyeye kadar çıkıyor. Ne yazık ki, projelerimin çoğu RVM kullandığı için bu hatta ihtiyacım var. Şimdi ne yapacağımı bilmiyorum.

Güncelleme 2 : Bu özellikle bir oh-my-zsh şeyi gibi görünüyor. Yükleme ~/.oh-my-zsh/oh-my-zsh.shyapmazsam bir sorunum yok.


1
ve şimdi bash kullanırsanız, hala yavaş mı?
nneonneo

Harika soru. Hayır, bash'ta hızlı.
Jason Swett

~/.z*Dosyalarınızı yoldan çekerseniz hala yavaş mı ?
user4815162342

Hayýr. Sanýrým bunlardan birinde bir ţey var.
Jason Swett

3
Depo büyükse, git st'i her seferinde çağırmak kabuğu yavaşlatabilir. Kapatmak için bu seçeneği kullanın. git config --add oh-my-zsh.hide durumu 1
Senthil Kumar

Yanıtlar:


173

Bunu git yapılandırmanıza ekleyebilirsiniz ve zsh artık durumu kontrol etmez

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

Açıklama

Lib / git.zsh içinde iki merkezi git işlevi vardır :

  • git_prompt_info()
  • parse_git_dirty()

Her Yöntem, devre dışı bırakmak için bir git yapılandırma anahtarına sahiptir:

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

Bazı temalar kendi git sorgularını oluşturur ve bazen bu bayrakları görmezden gelir .


4
Bu çözüm hala çalışıyor, bunu Symfony2 proje klasörümde denedim. Belki satıcı klasörü, tırmık klasörünün ray uygulamaları için yaptığı gibi işleri yavaşlatır? zsh artık hızlı ve zaten GIT zsh eklentisine ihtiyacım yok. Teşekkürler!
mblaettermann

Bu, sorunumu mükemmel bir şekilde çözdü. Hala güzel git-status işini diğer depolarda kullanabilirim, ancak büyük firefox kaynak kod depomda git yavaş yavaş kullanamıyorum.
Leo Ufimtsev

1
Kullanmak zorunda kaldım oh-my-zsh.hide-dirty. Değişmiş olabilir veya belki de temam (agnoster) yalnızca saygı duyar hide-dirty.
Benjamin Atkin

1
Bunu --global, burada açıklandığı gibi, serseri sanal kutu sanal kutusu sanal kutusu için genel ayarlarda yapmak gerçekten kullanışlıdır ( konukta yavaş, ana bilgisayarda hızlı): stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

7
git config --add oh-my-zsh.hide-dirty 1yavaş depom için ihtiyacım olan tek şeydi.
Johnathan Elmore

26

Oh_my_zsh, her komuttan sonra deponun durumunu kontrol ettiği için bazı depolar için yavaş görünüyor. Bu davranış, .oh_my_zsh'ın yeni sürümünde geçersiz kılınabilir. Sadece .zshrc'de aşağıdaki satırı kaldırın:

DISABLE_UNTRACKED_FILES_DIRTY = "doğru"

Bundan sonra, terminalinizi yeniden başlatın veya aşağıdakileri çalıştırın:

kaynak ~ / .zshrc


3
git config --add oh-my-zsh.hide-status 1işleri hızlandırır ancak VCS'nin zsh durumunu tamamen kaldırır. Bu onu koruyor ve yine de hızlandırıyor.
nyxz

1
Bunun işe yarayacağını umuyordum, ancak ~ / .zshrc kaynağından sonra bile bir etkisi olmadı. git config --add oh-my-zsh.hide-dirty 1benim için çalıştı. git config --global --add oh-my-zsh.hide-dirty 1bunu tüm depolar için devre dışı bırakmak için.
Johnathan Elmore

@JohnathanElmore @Peeyush, benzer olsalar bile ortamla DISABLE_UNTRACKED_FILES_DIRTY="true"aynı şeyi oh-my-zsh.hide-dirtyyapmıyor. Koda bakın: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . DISABLE_UNTRACKED_FILES_DIRTYAyarı sadece bir ekler --untracked-files=nobayrağı git statusoysa komuta oh-my-zsh.hide-dirty 1ayarı bütün atlar git statustamamen komutu. @ JohnathanElmore'un global git yapılandırma ayarı önerisini öneririm.
stwr667

13

Benim için VirtualBox'ta (konuk) yavaş, çünkü senkronize edilmiş bir klasör kullanıyorum. Yeterince hızlı olduğu OS X'te (ana bilgisayar) hala etkinleştirilmesini istiyorum. Depo ile depolanan ve bunu hem konukta hem de ana bilgisayarda değiştiren yerel bir yapılandırma ayarı kullanmak yerine, yalnızca konukta genel bir yapılandırma ayarı kullanıyorum :

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

Sadece tek bir depo için istersem:

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


11

oh-my-zsh" Zsh inanılmaz derecede yavaş başlar " bölümünde detaylandırıldığı gibi eklenti bölümünü temizleyerek an'ı hızlandırmanın çeşitli yolları vardır .

Örneğin, " Oh-my-zsh git-svn komut istemi yavaşlığı için düzeltme " blog yazısı , parse_git_dirtyişlevden potansiyel bir sorun olarak bahsediyor .


Bu şeyler, işlerin daha hızlı yüklenmesine neden olabilecek şeyleri görmek için yorum yapmaya başlamama yardımcı oldu. Sorunu daha da daralttım ve sorumu güncelledim.
Jason Swett

Compinit gönderisi benim için küçük bir miktar geliştirdi, ancak parse_git_dirty'nin kaldırılması işleri gerçekten hızlandırdı. Teşekkürler.
Raj

6

Sonunda anladım. rakeProjemde tonlarca dosya içeren bir klasör vardı (20.000 gibi). Bu klasörün ne için orada olduğu hakkında hiçbir fikrim yok, ancak onu sildim, Zsh artık yavaş değil ve uygulamam hala çalışıyor gibi görünüyor.


İlginç geri bildirim (
cevabımdan

5
Ve anlamam sadece 4 ayımı aldı!
Jason Swett

O kadar hızlı buluyorum! Birkaç yıl süren birini tanıyorum
VonC

3

Başka bir sürüm kontrol programıyla ilgilenmiyorsanız git, ancak , tüm vcs_infoURL'leri devre dışı bırakabilir *.zsh-themeve bunları yerel gitkomutlarla değiştirebilirsiniz .

Örneğin şu şekilde ayarlıyorum agnoster.zsh-theme:

  1. tüm satırları yorumla / kaldır vcs_info,
  2. prompt_git()işlevdeki kodu şuradan düzenle :

    ref="$vcs_info_msg_0_" -e

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

Yani, temel olarak, tüm vcs_infoeylemleri devre dışı bıraktım ve bunun yerine gitdeponun durumlarını kontrol etmek için yerel bir komut kullanıyorum . Sonuç olarak, kullanışlı git istemimi git olmayan bir dizinde çalışmak kadar hızlı bir hızla görebiliyorum. Bu küçük değişiklikle, zsh'im git depolarında 4-5 kat daha hızlı çalışabilir.

Not: BSD grep'i değil GNU grep'i kullanın.


1

Yukarıdaki cevaplar sorunumu çözmedi. Benim durumumda, işlev git_prompt_statusdiğerlerinden çok fazla zaman alıyor. Bu yüzden ~ / .oh-my-zsh / lib / git.zsh'ı değiştirdim, git_prompt_statusişlevi erken dönüş sürümümle değiştirdim :

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'i belirsiz bir işaret olarak kullansam da, bunu belirtmek istediğiniz herhangi bir durumu seçebilir veya git_prompt_statussizin durumunuzda çok daha hızlı bir işlev uygulayabilirsiniz .


0

Uzay gemisi temasını kullanan herkes için şunu ekleyin .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

benim için çalıştı. Açıkçası, terminal komut isteminizde git durumunu kaybedeceksiniz.

Bu temanın git seçenekleri burada bulunabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.