oh-my-zsh chậm, nhưng chỉ đối với một số repo Git


102

Gần đây tôi đã bắt đầu sử dụng Zsh và nó thật tuyệt vời. Thật không may, đối với dự án mà tôi coi là dự án “chính” của mình, mọi thứ đều chậm chạp. Ý tôi là mỗi khi tôi chạy một lệnh - lschẳng hạn như - có khoảng thời gian trễ khoảng năm giây giữa thời gian lệnh được thực thi và thời gian tôi có thể sử dụng lại thiết bị đầu cuối.

Điều gì có thể khác biệt về repo này khiến Zsh quá chậm? Tôi cho rằng đó là một thứ dành riêng cho Zsh vì không có vấn đề gì trước khi tôi bắt đầu sử dụng Zsh. Tôi đã thử làm một git cleannhưng nó không tạo ra bất kỳ sự khác biệt đáng chú ý nào.

Tôi đang sử dụng Mac OS X nếu điều đó quan trọng.

Cập nhật: Hóa ra dòng này của tôi .zshenvlà thứ đã làm cho nó chậm:

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

Nếu tôi nhận xét dòng đó, nó sẽ mất khoảng 3 giây để mất khoảng 1 giây. Thật không may, tôi cần dòng đó, vì nhiều dự án của tôi sử dụng RVM. Tôi không biết phải làm gì bây giờ.

Cập nhật 2 : đây dường như là một điều đặc biệt. Nếu tôi không tải ~/.oh-my-zsh/oh-my-zsh.sh, tôi không có vấn đề gì.


1
và nếu bây giờ bạn dùng bash thì có còn chậm không?
nneonneo

Câu hỏi hay. Không, nó nhanh trên bash.
Jason Swett

Nó vẫn còn chậm nếu bạn di chuyển các ~/.z*tệp của mình ra ngoài?
dùng4815162342

Không. Vì vậy, tôi đoán đó là một cái gì đó trong một trong số đó.
Jason Swett 7/10/12

3
Nếu repo lớn, việc gọi git st mọi lúc có thể làm chậm shell. Sử dụng tùy chọn này để tắt nó. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Câu trả lời:


171

Bạn có thể thêm cái này vào cấu hình git của mình và zsh sẽ không kiểm tra trạng thái nữa

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

Giải trình

Có hai hàm git trung tâm trong lib / git.zsh :

  • git_prompt_info()
  • parse_git_dirty()

Mỗi Phương thức có một công tắc cấu hình git để vô hiệu hóa nó:

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

Một số chủ đề tạo truy vấn git của riêng chúng và đôi khi bỏ qua các cờ này .


4
Giải pháp này vẫn hoạt động, chỉ cần thử điều này trong thư mục dự án Symfony2 của tôi. Có thể thư mục của nhà cung cấp làm cho mọi thứ chậm lại, giống như thư mục rake đối với các ứng dụng rails? zsh hiện nhanh và tôi không cần plugin GIT zsh. Cảm ơn!
mblaettermann

Điều này đã giải quyết vấn đề của tôi một cách hoàn hảo. Tôi vẫn có thể sử dụng trạng thái git kinh doanh tốt đẹp trong các kho lưu trữ khác, nhưng không phải trong kho lưu trữ mã nguồn firefox khổng lồ của tôi, nơi git nó chậm.
Leo Ufimtsev 13/02/16

1
Tôi đã phải sử dụng oh-my-zsh.hide-dirty. Nó có thể đã thay đổi hoặc có thể chủ đề của tôi (agnoster) chỉ tôn trọng hide-dirty.
Benjamin Atkin

1
Việc làm này trong cài đặt toàn cầu cho vms VirtualBox lang thang với --globalthực sự tiện dụng (chậm ở khách, nhanh chóng trên máy chủ) như mô tả ở đây: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

6
git config --add oh-my-zsh.hide-dirty 1là tất cả những gì tôi cần cho repo chậm của mình.
Johnathan Elmore

26

Oh_my_zsh có vẻ chậm đối với một số repo vì nó kiểm tra trạng thái của repo sau mỗi lệnh. Hành vi này có thể bị ghi đè trong phiên bản .oh_my_zsh mới. Chỉ cần Bỏ ghi chú dòng sau trong .zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "true"

Sau đó, khởi động lại thiết bị đầu cuối của bạn hoặc chạy như sau:

nguồn ~ / .zshrc


3
git config --add oh-my-zsh.hide-status 1tăng tốc mọi thứ nhưng nó loại bỏ hoàn toàn trạng thái zsh của VCS. Cái này giữ nó và vẫn tăng tốc.
nyxz,

1
Tôi đã hy vọng điều này sẽ thực hiện thủ thuật, nhưng không có tác dụng, ngay cả sau nguồn ~ / .zshrc. git config --add oh-my-zsh.hide-dirty 1đã làm việc cho tôi, mặc dù. git config --global --add oh-my-zsh.hide-dirty 1để tắt điều này cho tất cả các đại diện.
Johnathan Elmore

@JohnathanElmore @Peeyush, DISABLE_UNTRACKED_FILES_DIRTY="true"không làm điều tương tự như oh-my-zsh.hide-dirtycài đặt, mặc dù chúng tương tự nhau. Xem mã tại đây: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . Các DISABLE_UNTRACKED_FILES_DIRTYthiết lập chỉ đơn giản là thêm một --untracked-files=nolá cờ để các git statuslệnh, trong khi các oh-my-zsh.hide-dirty 1thiết lập sẽ bỏ toàn bộ git statuslệnh hoàn toàn. Tôi đề xuất đề xuất của @ JohnathanElmore về cài đặt cấu hình git chung.
stwr667

13

Đối với tôi, nó chậm trên VirtualBox (khách) vì tôi đang sử dụng một thư mục được đồng bộ hóa. Tôi vẫn muốn nó được kích hoạt trên OS X (máy chủ) ở nơi nó đủ nhanh. Thay vì sử dụng cài đặt cấu hình cục bộ được lưu trữ cùng với repo và sẽ thay đổi nó cả trên máy khách và máy chủ, tôi chỉ sử dụng cài đặt cấu hình chung trên máy khách :

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

Nếu tôi muốn nó chỉ cho một repo duy nhất:

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

12

Nó có thể là chủ đề gọi nội dung git và rvm sau mỗi lệnh.

Đối với tôi, thay đổi ZSH_THEME="juanghurtadoto"để ZSH_THEME="miloshadzic"loại bỏ hoàn toàn độ trễ 2 giây sau mỗi lệnh.

Các chủ đề có thể tìm thấy tại https://github.com/robbyrussell/oh-my-zsh/wiki/themes


Hấp dẫn. +1. Điều này cụ thể hơn câu trả lời của tôi.
VonC

11

Có nhiều cách khác nhau để tăng tốc độ oh-my-zsh, như được nêu chi tiết trong " zsh khởi động cực kỳ chậm ", dọn dẹp phần plugin.

Ví dụ: bài đăng trên blog " Khắc phục sự cố chậm của oh-my-zsh git-svn " đề cập đến parse_git_dirtychức năng này như một vấn đề tiềm ẩn.


Nội dung đó đã giúp tôi bắt đầu bình luận mọi thứ để xem điều gì có thể khiến mọi thứ tải nhanh hơn. Tôi đã thu hẹp vấn đề hơn nữa và cập nhật câu hỏi của mình.
Jason Swett 9/10/12

Bài đăng compinit đã cải thiện một chút đối với tôi, nhưng việc loại bỏ parse_git_dirty thực sự đẩy nhanh mọi thứ. Cảm ơn.
Raj

6

Cuối cùng tôi đã tìm nó ra. Dự án của tôi có một rakethư mục với hàng tấn tệp (như 20.000). Tôi không biết thư mục đó ở đó để làm gì, nhưng tôi đã xóa nó, Zsh không còn chậm nữa và ứng dụng của tôi dường như vẫn hoạt động.


Phản hồi thú vị (chính xác hơn câu trả lời của tôi) +1
VonC

5
Và tôi chỉ mất 4 tháng để tìm ra!
Jason Swett

Tôi thấy rằng nhanh chóng! Tôi biết somes mất vài năm ;) meta.stackexchange.com/questions/36318/…
VonC

3

Nếu bạn không quan tâm đến các chương trình kiểm soát phiên bản khác git, nhưng bạn có thể vô hiệu hóa tất cả các chương trình vcs_infotrong của bạn *.zsh-themevà thay thế chúng bằng gitcác lệnh gốc .

Ví dụ, tôi chỉnh sửa của mình agnoster.zsh-themebằng cách:

  1. nhận xét / xóa tất cả các dòng có vcs_info,
  2. chỉnh sửa mã trong prompt_git()chức năng từ:

    ref="$vcs_info_msg_0_" đến

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

Vì vậy, về cơ bản, tôi chỉ tắt tất cả các vcs_infohành động và thay vào đó sử dụng gitlệnh gốc để kiểm tra trạng thái của repo. Do đó, tôi vẫn có thể thấy lời nhắc git hữu ích của mình với tốc độ nhanh như làm việc trong thư mục không phải git. Với sửa đổi nhỏ này, zsh của tôi có thể hoạt động nhanh hơn 4-5 lần trong git repos.

Lưu ý: sử dụng GNU grep không phải BSD grep.


1

Các câu trả lời ở trên không giải quyết được vấn đề của tôi. Trong trường hợp của tôi, chức năng git_prompt_statusnày mất quá nhiều thời gian so với những chức năng khác. Vì vậy, tôi đã sửa đổi ~ / .oh-my-zsh / lib / git.zsh, thay thế git_prompt_statushàm bằng phiên bản trả lại đầu tiên của tôi:

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
}

Trong khi tôi sử dụng ZSH_THEME_GIT_PROMPT_MODIFIED làm dấu chưa xác định, bạn có thể chọn bất kỳ trạng thái nào bạn muốn để chỉ ra điều đó hoặc triển khai một git_prompt_statuschức năng nhanh hơn nhiều trong trường hợp của bạn.


0

Đối với bất kỳ ai sử dụng chủ đề tàu vũ trụ, hãy thêm điều này vào .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

đã làm cho tôi. Rõ ràng, bạn sẽ mất trạng thái git trong dấu nhắc đầu cuối của mình.

Các tùy chọn git cho chủ đề này có thể được tìm thấy tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.