oh-my-zsh ช้า แต่สำหรับ Git repo บางตัวเท่านั้น


105

ฉันเพิ่งเริ่มใช้ Zsh และมันยอดเยี่ยมมาก น่าเสียดายสำหรับโครงการนี้ฉันคิดว่าโครงการ "หลัก" ของฉันทุกอย่างช้า สิ่งที่ฉันหมายถึงคือทุกครั้งที่เรียกใช้คำสั่ง - lsตัวอย่างเช่นมีการหน่วงเวลาประมาณห้าวินาทีระหว่างเวลาที่เรียกใช้คำสั่งและเวลาที่ฉันสามารถใช้เทอร์มินัลได้อีกครั้ง

สิ่งที่อาจแตกต่างกันเกี่ยวกับ repo นี้ที่ทำให้ 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 : สิ่งนี้ดูเหมือนจะเป็นเรื่องของ oh-my-zsh โดยเฉพาะ ถ้าไม่โหลด~/.oh-my-zsh/oh-my-zsh.shก็ไม่มีปัญหา


1
แล้วถ้าใช้ bash ตอนนี้ยังช้าอยู่ไหม
nneonneo

คำถามที่ยอดเยี่ยม ไม่มันเร็วในการทุบตี
Jason Swett

ยังช้า~/.z*อยู่หรือเปล่าถ้าคุณย้ายไฟล์ออกจากทาง?
user4815162342

ไม่ฉันเดาว่ามันเป็นสิ่งหนึ่งในนั้น
Jason Swett

4
หาก repo มีขนาดใหญ่การเรียก git st everytime อาจทำให้เชลล์ทำงานช้าลง ใช้ตัวเลือกนี้เพื่อปิด git config - เพิ่ม oh-my-zsh.hide-status 1
Senthil Kumar

คำตอบ:


188

คุณสามารถเพิ่มสิ่งนี้ในการกำหนดค่าคอมไพล์ของคุณและ zsh จะไม่ตรวจสอบสถานะอีกต่อไป

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

คำอธิบาย

มีฟังก์ชัน git กลางสองฟังก์ชันในlib / git.zsh :

  • git_prompt_info()
  • parse_git_dirty()

แต่ละวิธีมีสวิตช์ config git เพื่อปิดใช้งาน:

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

รูปแบบที่บางคนสร้างแบบสอบถามคอมไพล์ของตัวเองและบางครั้งไม่สนใจสถานะเหล่านี้


4
วิธีนี้ยังใช้งานได้เพียงลองใช้ในโฟลเดอร์โครงการ Symfony2 ของฉัน บางทีโฟลเดอร์ผู้ขายอาจทำให้สิ่งต่างๆช้าลงเช่นโฟลเดอร์คราดสำหรับแอปราง? zsh เร็วแล้วและฉันไม่ต้องการปลั๊กอิน GIT zsh อยู่แล้ว ขอบคุณ!
mblaettermann

สิ่งนี้ช่วยแก้ปัญหาของฉันได้อย่างสมบูรณ์แบบ ฉันยังสามารถใช้ธุรกิจ git-status ที่ดีใน repos อื่น ๆ ได้ แต่ไม่ใช่ใน repo ซอร์สโค้ด firefox ขนาดใหญ่ของฉันที่คอมไพล์มันช้า
Leo Ufimtsev

1
ฉันต้องใช้oh-my-zsh.hide-dirty. มันอาจจะมีการเปลี่ยนแปลงหรืออาจจะรูปแบบของฉัน (agnoster) hide-dirtyเพียงประการ
Benjamin Atkin

1
การทำเช่นนี้ในการตั้งค่าส่วนกลางสำหรับ vms virtualbox แบบคนจรจัดมี--globalประโยชน์มาก (ช้าในผู้เยี่ยมชมเร็วบนโฮสต์) ตามที่อธิบายไว้ที่นี่: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

7
git config --add oh-my-zsh.hide-dirty 1คือทั้งหมดที่ฉันต้องการสำหรับ repo ช้าของฉัน
Johnathan Elmore

28

ดูเหมือนว่า Oh_my_zsh จะช้าสำหรับบาง repos เนื่องจากตรวจสอบสถานะของ repo หลังจากแต่ละคำสั่ง พฤติกรรมนี้สามารถลบล้างได้ใน. oh_my_zsh เวอร์ชันใหม่ เพียงแค่ยกเลิกการใส่ข้อคิดเห็นบรรทัดต่อไปนี้ใน. zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "จริง"

หลังจากนี้ให้รีสตาร์ทเทอร์มินัลของคุณหรือเรียกใช้สิ่งต่อไปนี้:

ที่มา ~ / .zshrc


4
git config --add oh-my-zsh.hide-status 1เร่งความเร็วให้เร็วขึ้น แต่จะลบสถานะ zsh ของ VCS โดยสิ้นเชิง อันนี้เก็บไว้และยังเร่งความเร็ว
nyxz

1
ฉันหวังว่านี่จะเป็นการหลอกลวง แต่ก็ไม่มีผลแม้จะเป็นแหล่งที่มา ~ / .zshrc git config --add oh-my-zsh.hide-dirty 1ทำงานให้ฉันแม้ว่า git config --global --add oh-my-zsh.hide-dirty 1เพื่อปิดใช้งานสิ่งนี้สำหรับ repos ทั้งหมด
Johnathan Elmore

@JohnathanElmore @Peeyush DISABLE_UNTRACKED_FILES_DIRTY="true"ไม่ได้ทำสิ่งเดียวกันกับoh-my-zsh.hide-dirtyฉากแม้ว่าจะคล้ายกันก็ตาม ดูรหัสที่นี่: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 การDISABLE_UNTRACKED_FILES_DIRTYตั้งค่าเพียงแค่เพิ่ม--untracked-files=noค่าสถานะให้กับgit statusคำสั่งในขณะที่การoh-my-zsh.hide-dirty 1ตั้งค่าจะข้ามgit statusคำสั่งทั้งหมดไปทั้งหมด ฉันขอแนะนำข้อเสนอแนะของ @JohnathanElmore เกี่ยวกับการตั้งค่า git config ทั่วโลก
stwr667

14

อาจเป็นธีมที่เรียกสิ่ง git และ rvm หลังจากทุกคำสั่ง

สำหรับฉันการเปลี่ยนZSH_THEME="juanghurtadoto"เพื่อZSH_THEME="miloshadzic"ลบการหน่วงเวลา 2 วินาทีหลังจากทุกคำสั่งสมบูรณ์

สามารถดูธีมได้ที่https://github.com/robbyrussell/oh-my-zsh/wiki/themes


น่าสนใจ. +1. นี่เป็นคำตอบที่เฉพาะเจาะจงมากกว่าคำตอบของฉัน
VonC

13

สำหรับฉันมันช้าใน VirtualBox (แขก) เพราะฉันใช้โฟลเดอร์ที่ซิงค์ ฉันยังต้องการให้เปิดใช้งานบน OS X (โฮสต์) ซึ่งเร็วพอ แทนที่จะใช้การตั้งค่าการกำหนดค่าภายในซึ่งเก็บไว้กับ repo และจะเปลี่ยนทั้งในแขกและโฮสต์ฉันใช้การตั้งค่าการกำหนดค่าส่วนกลางเฉพาะกับแขก :

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

หากฉันต้องการเพียง repo เดียว:

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

11

มีหลายวิธีในการเร่งความเร็วoh-my-zshตามรายละเอียดใน " zsh เริ่มช้าอย่างไม่น่าเชื่อ " การทำความสะอาดส่วนปลั๊กอิน

ตัวอย่างเช่นบล็อกโพสต์ " Fix for oh-my-zsh git-svn prompt slowness " กล่าวถึงparse_git_dirtyฟังก์ชันนี้ว่าเป็นปัญหาที่อาจเกิดขึ้นได้


สิ่งนั้นช่วยในการทำให้ฉันเริ่มแสดงความคิดเห็นเพื่อดูว่าอะไรจะทำให้โหลดได้เร็วขึ้น ฉัน จำกัด ปัญหาให้แคบลงและอัปเดตคำถามของฉัน
Jason Swett

โพสต์ compinit ช่วยเพิ่มจำนวนเล็กน้อยสำหรับฉัน แต่การลบ parse_git_dirty ทำให้สิ่งต่างๆเร็วขึ้น ขอบคุณ.
Raj

6

ในที่สุดฉันก็คิดออก โครงการของฉันมีrakeโฟลเดอร์ที่มีไฟล์มากมาย (เช่น 20,000 ไฟล์) ฉันไม่รู้ว่าโฟลเดอร์นั้นมีไว้เพื่ออะไร แต่ฉันลบไปแล้ว Zsh ไม่ช้าอีกต่อไปและแอปของฉันก็ยังใช้งานได้


ข้อเสนอแนะที่น่าสนใจ (แม่นยำกว่าคำตอบของฉัน) +1
VonC

5
และใช้เวลาเพียง 4 เดือนในการคิดออก!
Jason Swett

ฉันพบว่าเร็ว! ฉันรู้ว่าคนที่ใช้เวลาหลายปี ;) meta.stackexchange.com/questions/36318/…
VonC

3

หากคุณไม่สนใจเกี่ยวกับโปรแกรมควบคุมเวอร์ชันอื่น แต่gitคุณสามารถปิดการใช้งานทั้งหมดvcs_infoในของคุณ*.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คำสั่งเนทีฟเพื่อตรวจสอบสถานะของ repo แทน เป็นผลให้ฉันยังคงเห็น git prompt ที่มีประโยชน์ด้วยความเร็วที่เร็วพอ ๆ กับการทำงานในไดเรกทอรีที่ไม่ใช่ git ด้วยการปรับเปลี่ยนเล็กน้อยนี้ zsh ของฉันสามารถทำงานได้เร็วขึ้น 4-5 เท่าภายใน git repos

หมายเหตุ: ใช้ GNU grep ไม่ใช่ BSD grep


1

คำตอบข้างต้นไม่สามารถแก้ปัญหาของฉันได้ ในกรณีของฉันฟังก์ชันนี้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ฟังก์ชันที่เร็วกว่ามากในกรณีของคุณ


0

สำหรับใครก็ตามที่ใช้ธีมยานอวกาศให้เพิ่มสิ่งนี้ใน.zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

ทำงานให้ฉัน เห็นได้ชัดว่าคุณจะสูญเสียสถานะคอมไพล์ในพรอมต์เทอร์มินัลของคุณ

คุณสามารถดูตัวเลือกคอมไพล์สำหรับธีมนี้ได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.