oh-my-zsh lambat, tetapi hanya untuk repo Git tertentu

104

Saya baru saja mulai menggunakan Zsh dan itu luar biasa. Sayangnya, untuk proyek yang saya anggap sebagai proyek "utama" saya, semuanya berjalan lambat. Yang saya maksud adalah bahwa setiap kali saya menjalankan perintah - ls, misalnya - ada penundaan sekitar lima detik antara waktu perintah dijalankan dan waktu saya dapat menggunakan terminal lagi.

Apa yang bisa berbeda dari repo yang satu ini yang membuat Zsh sangat lambat? Saya berasumsi ini adalah hal khusus Zsh karena tidak ada masalah sebelum saya mulai menggunakan Zsh. Saya mencoba melakukan a git cleantetapi tidak membuat perbedaan yang mencolok.

Saya menggunakan Mac OS X jika itu penting.

Pembaruan: Ternyata baris saya .zshenvinilah yang membuatnya lambat:

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

Jika saya mengomentari baris itu, dari butuh sekitar 3 detik menjadi sekitar 1 detik. Sayangnya, saya membutuhkan baris itu, karena banyak proyek saya menggunakan RVM. Saya tidak tahu harus berbuat apa sekarang.

Pembaruan 2 : ini tampaknya secara khusus merupakan hal oh-my-zsh. Jika saya tidak memuat ~/.oh-my-zsh/oh-my-zsh.sh, saya tidak punya masalah.

Jason Swett
sumber
1
dan jika Anda menggunakan bash sekarang, apakah masih lambat?
nneonneo
Pertanyaan yang bagus. Tidak, ini cepat saat pesta.
Jason Swett
Apakah masih lambat jika Anda memindahkan ~/.z*file Anda ?
pengguna4815162342
Tidak. Jadi kurasa itu sesuatu di salah satunya.
Jason Swett
4
Jika reponya besar, memanggil git st setiap saat mungkin memperlambat shell. Gunakan opsi ini untuk mematikannya. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Jawaban:

187

Anda dapat menambahkan ini ke konfigurasi git Anda dan zsh tidak akan memeriksa statusnya lagi

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

Penjelasan

Ada dua fungsi git pusat di lib / git.zsh :

  • git_prompt_info()
  • parse_git_dirty()

Setiap Metode memiliki sakelar konfigurasi git untuk menonaktifkannya:

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

Beberapa tema membuat kueri gitnya sendiri dan terkadang mengabaikan tanda ini .

Pascalius
sumber
4
Solusi ini masih berfungsi, coba saja ini di folder proyek Symfony2 saya. Mungkin folder vendor membuat semuanya lambat, seperti yang dilakukan folder rake untuk aplikasi rel? zsh sekarang cepat, dan saya tidak membutuhkan plugin GIT zsh. Terima kasih!
mblaettermann
Ini memecahkan masalah saya dengan sempurna. Saya masih bisa menggunakan bisnis status git yang bagus di repo lain, tetapi tidak di repo kode sumber firefox saya yang besar di mana git itu lambat.
Leo Ufimtsev
1
Saya harus menggunakan oh-my-zsh.hide-dirty. Mungkin telah berubah atau mungkin tema saya (agnoster) hanya menghormati hide-dirty.
Benjamin Atkin
1
Melakukan ini dalam pengaturan global untuk vms virtualbox gelandangan dengan --globalsangat berguna (lambat dalam tamu, cepat pada host) seperti yang dijelaskan di sini: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux
7
git config --add oh-my-zsh.hide-dirty 1itu semua yang saya butuhkan untuk repo lambat saya.
Johnathan Elmore
27

Oh_my_zsh tampaknya lambat untuk beberapa repo karena memeriksa status repo setelah setiap perintah. Perilaku ini dapat diganti di versi baru .oh_my_zsh. Cukup Uncomment baris berikut di .zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "benar"

Setelah ini, mulai ulang terminal Anda atau jalankan perintah berikut:

sumber ~ / .zshrc

Peeyush Goela
sumber
4
git config --add oh-my-zsh.hide-status 1mempercepat semuanya tetapi itu sepenuhnya menghapus status zsh dari VCS. Yang ini menyimpannya dan tetap mempercepatnya.
nyxz
1
Saya berharap ini akan melakukan trik, tetapi tidak berpengaruh, bahkan setelah sumber ~ / .zshrc. git config --add oh-my-zsh.hide-dirty 1berhasil untuk saya. git config --global --add oh-my-zsh.hide-dirty 1untuk menonaktifkan ini untuk semua repo.
Johnathan Elmore
@JohnathanElmore @Peeyush, DISABLE_UNTRACKED_FILES_DIRTY="true"tidak melakukan hal yang sama dengan oh-my-zsh.hide-dirtypengaturan, meskipun serupa. Lihat kodenya di sini: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . The DISABLE_UNTRACKED_FILES_DIRTYPengaturan hanya menambahkan --untracked-files=nobendera ke git statusperintah, sedangkan oh-my-zsh.hide-dirty 1pengaturan akan melewatkan seluruh git statusperintah sama sekali. Saya merekomendasikan saran @ JohnathanElmore tentang pengaturan konfigurasi git global.
stwr667
14

Ini bisa menjadi tema yang memanggil hal-hal git dan rvm setelah setiap perintah.

Bagi saya, mengubah ZSH_THEME="juanghurtadoto"menjadi ZSH_THEME="miloshadzic"menghapus penundaan 2 detik setelah setiap perintah sepenuhnya.

Tema dapat ditemukan di https://github.com/robbyrussell/oh-my-zsh/wiki/themes

James EJ
sumber
Menarik. +1. Ini lebih spesifik dari jawaban saya.
VonC
13

Bagi saya itu lambat di VirtualBox (tamu) karena saya menggunakan folder yang disinkronkan. Saya masih ingin itu diaktifkan di OS X (host) yang cukup cepat. Alih-alih menggunakan pengaturan konfigurasi lokal yang disimpan dengan repo dan akan mengubahnya baik pada tamu dan tuan rumah, saya menggunakan pengaturan konfigurasi global hanya pada tamu :

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

Jika saya menginginkannya hanya untuk satu repo:

git config --add oh-my-zsh.hide-dirty 1
Benjamin Atkin
sumber
11

Ada berbagai cara untuk mempercepat oh-my-zsh, seperti yang dijelaskan dalam " zsh dimulai dengan sangat lambat ", membersihkan bagian plugin.

Misalnya, entri blog " Memperbaiki kelambatan perintah oh-my-zsh git-svn " menyebutkan parse_git_dirtyfungsi tersebut sebagai potensi masalah.

VonC
sumber
Hal-hal itu membantu karena itu membuat saya mulai berkomentar untuk melihat apa yang mungkin membuat semuanya dimuat lebih cepat. Saya mempersempit masalah lebih lanjut dan memperbarui pertanyaan saya.
Jason Swett
Posting compinit meningkatkan sedikit bagi saya, tetapi menghapus parse_git_dirty benar-benar mempercepat segalanya. Terima kasih.
Raj
6

Saya akhirnya menemukan jawabannya. Proyek saya memiliki rakefolder dengan banyak file (seperti 20.000). Saya tidak tahu untuk apa folder itu ada di sana, tetapi saya menghapusnya, Zsh tidak lagi lambat, dan aplikasi saya sepertinya masih berfungsi.

Jason Swett
sumber
Umpan balik yang menarik (lebih tepat daripada jawaban saya) +1
VonC
5
Dan saya hanya butuh 4 bulan untuk mengetahuinya!
Jason Swett
Saya menemukan secepat itu! Saya tahu beberapa orang yang membutuhkan beberapa tahun ;) meta.stackexchange.com/questions/36318/…
VonC
3

Jika Anda tidak peduli tentang program kontrol versi lain tetapi git, Anda dapat menonaktifkan semua vcs_infodi Anda *.zsh-themedan menggantinya dengan gitperintah asli .

Misalnya saya men-tweak my agnoster.zsh-themeby:

  1. komentari / hapus semua baris yang memiliki vcs_info,
  2. edit kode dalam prompt_git()fungsi dari:

    ref="$vcs_info_msg_0_" untuk

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

Jadi, pada dasarnya, saya baru saja menonaktifkan semua vcs_infotindakan, dan sebagai gantinya menggunakan gitperintah asli untuk memeriksa status repo. Hasilnya, saya masih dapat melihat perintah git yang berguna dengan kecepatan secepat bekerja di direktori non-git. Dengan modifikasi kecil ini, zsh saya bisa bekerja 4-5x lebih cepat dalam git repo.

Catatan: gunakan GNU grep bukan BSD grep.

fronthem
sumber
1

Jawaban di atas tidak menyelesaikan masalah saya. Dalam kasus saya, fungsinya git_prompt_statusmemakan waktu terlalu banyak daripada yang lain. Jadi saya memodifikasi ~ / .oh-my-zsh / lib / git.zsh, mengganti git_prompt_statusfungsi dengan versi pengembalian awal saya:

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
}

Meskipun saya menggunakan ZSH_THEME_GIT_PROMPT_MODIFIED sebagai tanda belum ditentukan, Anda dapat memilih status apa pun yang Anda suka untuk menunjukkannya atau menerapkan git_prompt_statusfungsi yang jauh lebih cepat dalam kasus Anda.

Xavier.S
sumber
0

Untuk siapa pun yang menggunakan tema pesawat luar angkasa, tambahkan ini ke .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

bekerja untuk saya. Jelas, Anda akan kehilangan status git di prompt terminal Anda.

Opsi git untuk tema ini dapat ditemukan di sini

Harpal
sumber