ओह-माई-ज़श धीमा, लेकिन केवल कुछ गिट रेपो के लिए


102

मैंने हाल ही में Zsh का उपयोग करना शुरू किया है और यह बहुत बढ़िया है। दुर्भाग्य से, परियोजना के लिए मैं अपनी "मुख्य" परियोजना पर विचार करता हूं, सब कुछ धीमा है। मेरा मतलब है कि हर बार जब मैं एक कमांड चलाता हूं - lsउदाहरण के लिए - कमांड निष्पादित होने के समय और टर्मिनल को फिर से उपयोग करने के समय के बीच लगभग पांच सेकंड की देरी हो सकती है।

इस एक रेपो के बारे में क्या अलग हो सकता है जो ज़श को इतना धीमा बनाता है? मुझे लगता है कि यह एक ज़ीश-विशिष्ट बात है क्योंकि ज़श का उपयोग करने से पहले मुझे कोई समस्या नहीं थी। मैंने कोशिश की, git cleanलेकिन इससे कोई फर्क नहीं पड़ा।

मैं मैक ओएस एक्स पर हूँ अगर वह मायने रखता है।

अद्यतन: मेरी इस लाइन को चालू करता .zshenvहै जो इसे धीमा कर रहा है:

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

अगर मैं उस लाइन पर टिप्पणी करता हूं, तो लगभग 3 सेकंड लेने से लेकर 1 सेकंड तक का समय लगता है। दुर्भाग्य से, मुझे उस लाइन की आवश्यकता है, क्योंकि मेरी कई परियोजनाएं आरवीएम का उपयोग करती हैं। मुझे नहीं पता कि अब क्या करना है।

अद्यतन 2 : यह विशेष रूप से ओह-माय-ज़श चीज़ लगती है। अगर मैं लोड नहीं करता हूं ~/.oh-my-zsh/oh-my-zsh.sh, तो मुझे कोई समस्या नहीं है।


1
और यदि आप अभी बैश का उपयोग करते हैं, तो क्या यह अभी भी धीमा है?
nnonneo

बहुत बढ़िया सवाल। नहीं, यह तेज है।
जेसन स्वेट

क्या यह अभी भी धीमा है अगर आप अपनी ~/.z*फ़ाइलों को रास्ते से हटा दें?
user4815162342

नहीं, तो मुझे लगता है कि यह उनमें से एक में कुछ है।
जेसन स्वेट

3
यदि रेपो बड़ा है, तो कॉलिंग सेंट सेंट हर समय शेल को धीमा कर सकता है। इसे बंद करने के लिए इस विकल्प का उपयोग करें। git config --add oh-my-zsh.hide-status 1
सेंथिल कुमार

जवाबों:


171

आप इसे अपने 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_prompt_info()
  • parse_git_dirty()

प्रत्येक विधि में इसे अक्षम करने के लिए एक git config स्विच है:

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

कुछ थीम अपने स्वयं के गिट क्वेश्चन बनाते हैं और कभी-कभी इन झंडों को अनदेखा कर देते हैं


4
यह समाधान अभी भी काम करता है, बस अपने Symfony2 प्रोजेक्ट फ़ोल्डर में यह कोशिश की। हो सकता है कि वेंडर फोल्डर चीजों को धीमा कर देता है, जैसे रेक फोल्डर रेल्स एप्स के लिए करता है? zsh अब तेज है, और मुझे वैसे भी GIT zsh प्लगइन की आवश्यकता नहीं है। धन्यवाद!
mblaettermann

इससे मेरी समस्या पूरी तरह हल हो गई। मैं अभी भी अन्य प्रतिनिधि में अच्छे git-status व्यवसाय का उपयोग कर सकता हूं, लेकिन मेरे विशाल फ़ायरफ़ॉक्स स्रोत कोड रेपो में नहीं जहां यह धीमा है।
सिंह उफिम्त्सेव

1
मुझे इस्तेमाल करना था oh-my-zsh.hide-dirty। यह बदल सकता है या शायद मेरा विषय (एग्नॉस्टर) केवल सम्मान करता है hide-dirty
बेंजामिन एटकिन


6
git config --add oh-my-zsh.hide-dirty 1क्या मुझे अपने धीमे रेपो की ज़रूरत थी।
जॉनथन एलमोर

26

Oh_my_zsh कुछ रिपोज के लिए धीमा प्रतीत होता है क्योंकि यह प्रत्येक कमांड के बाद रेपो की स्थिति की जांच करता है। .Oh_my_zsh के नए संस्करण में इस व्यवहार को ओवरराइड किया जा सकता है। बस .zshrc में निम्न पंक्ति को शामिल करें:

DISABLE_UNTRACKED_FILES_DIRTY = "true"

इसके बाद, अपने टर्मिनल को पुनः आरंभ करें या निम्नलिखित को चलाएँ:

source ~ / .zshrc


3
git config --add oh-my-zsh.hide-status 1चीजों को गति दें लेकिन यह पूरी तरह से वीसीएस की स्थिति को हटा देता है। यह एक रखता है और अभी भी इसे गति देता है।
nyxz

1
मैं उम्मीद कर रहा था कि यह ट्रिक करेगा, लेकिन स्रोत के बाद भी कोई असर नहीं, ~ / .shshrc git config --add oh-my-zsh.hide-dirty 1मेरे लिए काम किया, यद्यपि। git config --global --add oh-my-zsh.hide-dirty 1सभी रेपो के लिए इसे निष्क्रिय करने के लिए।
जोनाथन एलमोर

@JohnathanElmore @Peeyush, सेटिंग DISABLE_UNTRACKED_FILES_DIRTY="true"के समान कार्य नहीं करता oh-my-zsh.hide-dirty, भले ही वे समान हों। : कोड यहाँ देखें github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17DISABLE_UNTRACKED_FILES_DIRTYसेटिंग बस एक कहते हैं --untracked-files=noकरने के लिए ध्वज git status, आदेश जबकि oh-my-zsh.hide-dirty 1सेटिंग पूरे छोड़ देगा git statusपूरी तरह कमान। मैं वैश्विक गिट विन्यास की स्थापना के @ JohnathanElmore के सुझाव की सलाह देता हूं।
stwr667

13

मेरे लिए यह VirtualBox (अतिथि) पर धीमा है क्योंकि मैं एक सिंक किए गए फ़ोल्डर का उपयोग कर रहा हूं। मैं अभी भी इसे ओएस एक्स (होस्ट) पर सक्षम करना चाहता हूं जहां यह काफी तेज है। स्थानीय कॉन्फ़िगरेशन सेटिंग का उपयोग करने के बजाय, जो रेपो के साथ संग्रहीत है और इसे अतिथि और होस्ट दोनों पर बदल देगा, मैं केवल अतिथि पर एक वैश्विक कॉन्फ़िगरेशन सेटिंग का उपयोग करता हूं :

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

अगर मैं इसे केवल एक रेपो के लिए चाहता हूं:

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

12

यह हर कमांड के बाद git और rvm सामान कहलाने वाला विषय हो सकता है।

मेरे लिए, पूरी तरह से हर कमांड के बाद 2 सेकंड की देरी ZSH_THEME="juanghurtadoto"को ZSH_THEME="miloshadzic"हटाने के लिए बदलना ।

विषय-वस्तु https://github.com/robbyrussell/oh-my-zsh/wiki/themes पर देखे जा सकते हैं


दिलचस्प। +1। यह मेरे उत्तर से अधिक विशिष्ट है।
VonC

11

एक तेजी लाने के लिए विभिन्न तरीके हैं oh-my-zsh, जैसा कि " ज़ेड अविश्वसनीय रूप से धीरे-धीरे शुरू होता है " में विस्तृत है , प्लगइन अनुभाग को साफ करना।

उदाहरण के लिए, ब्लॉग पोस्ट " फिक्स फॉर ओह-माय-ज़िश जीआईटी-स्वीन प्रॉम्प्ट स्लोनेस " parse_git_dirtyसंभावित फ़ंक्शन के रूप में फ़ंक्शन का उल्लेख करता है ।


उस सामान ने इसमें मदद की, जिससे मुझे यह देखने के लिए कि क्या चीजें तेजी से लोड हो सकती हैं, सामान की टिप्पणी करना शुरू कर दिया। मैंने समस्या को और कम कर दिया और अपने प्रश्न को अपडेट कर दिया।
जेसन स्वेट ऑक्ट

संकलित पोस्ट ने मेरे लिए एक छोटी राशि में सुधार किया, लेकिन वास्तव में चीज़ों को छाँट दिया। धन्यवाद।
राज

6

मुझे अंत में यह समझ आ गया। मेरी परियोजना में एक rakeटन फ़ाइलों के साथ एक फ़ोल्डर था (जैसे 20,000)। मुझे नहीं पता कि वह फ़ोल्डर किस लिए था, लेकिन मैंने इसे हटा दिया, Zsh अब धीमा नहीं है, और मेरा ऐप अभी भी काम कर रहा है।


दिलचस्प प्रतिक्रिया (मेरे उत्तर से अधिक सटीक) +1
वॉन

5
और मुझे केवल यह पता लगाने में 4 महीने लग गए!
जेसन स्विट

मुझे वह तेज़ लगता है! मुझे पता है कि कई साल लग जाते हैं ;) meta.stackexchange.com/questions/36318/…
VonC

3

यदि आप किसी अन्य संस्करण नियंत्रण कार्यक्रमों के बारे में परवाह नहीं करते हैं git, लेकिन , आप बस vcs_infoअपने सभी s को अक्षम कर सकते हैं *.zsh-themeऔर उन्हें मूल gitआदेशों से बदल सकते हैं ।

उदाहरण के लिए मैंने अपना ट्वीक agnoster.zsh-themeकिया:

  1. सभी पंक्तियों को टिप्पणी / हटा दें vcs_info,
  2. prompt_git()से फ़ंक्शन में कोड संपादित करें :

    ref="$vcs_info_msg_0_" सेवा

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

इसलिए, मूल रूप से, मैंने अभी सभी vcs_infoकार्यों को अक्षम कर दिया है, और इसके बजाय gitरेपो की स्थिति की जांच के लिए एक देशी कमांड का उपयोग करता हूं । नतीजतन, मैं अभी भी अपने उपयोगी गिट प्रॉम्प्ट को एक गति के साथ तेजी से देख सकता हूं जो गैर-गिट निर्देशिका में काम कर रहा है। इस छोटे से संशोधन के साथ, मेरे चिड़ियाघर git repos के भीतर 4-5x तेजी से काम कर सकता है।

नोट: GNU grep का उपयोग न करें BSD grep।


1

ऊपर दिए गए जवाबों से मेरी समस्या हल नहीं हुई। मेरे मामले में, फ़ंक्शन git_prompt_statusदूसरों की तुलना में बहुत अधिक समय लेता है। इसलिए मैंने git_prompt_statusअपने प्रारंभिक रिटर्न संस्करण के साथ फंक्शन की जगह ~ / .oh-my-zsh / lib / git.zsh को संशोधित किया :

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अपने मामले में बहुत तेज़ फ़ंक्शन लागू करें।


0

स्पेसशिप थीम का उपयोग करने वाले किसी व्यक्ति के लिए इसे जोड़ें .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

मेरे लिए काम किया। जाहिर है, आप अपने टर्मिनल प्रॉम्प्ट में गिट की स्थिति खो देंगे।

इस विषय के git विकल्प यहां देखे जा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.