oh-my-zsh는 느리지 만 특정 Git 저장소에서만


102

나는 최근에 Zsh를 사용하기 시작했고 그것은 굉장합니다. 안타깝게도 제가 "주요"프로젝트라고 생각하는 프로젝트의 경우 모든 것이 느립니다. 내 말은 명령을 실행할 때마다- ls예를 들어-명령이 실행되는 시간과 터미널을 다시 사용할 수있는 시간 사이에 약 5 초의 지연이 있다는 것입니다.

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 2010 년

훌륭한 질문입니다. 아니요, bash에서는 빠릅니다.
제이슨 Swett

~/.z*파일 을 이동해도 여전히 느리 나요?
user4815162342 2010 년

아뇨. 그 중 하나에있는 것 같아요.
Jason Swett 2012 년

3
저장소가 큰 경우 git st를 매번 호출하면 쉘 속도가 느려질 수 있습니다. 이 옵션을 사용하여 끄십시오. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

답변:


171

이것을 git 구성에 추가 할 수 있으며 zsh는 더 이상 상태를 확인하지 않습니다.

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

설명

lib / git.zsh 에는 두 가지 중앙 git 함수가 있습니다 .

  • git_prompt_info()
  • parse_git_dirty()

각 메소드에는 비활성화하는 git 구성 스위치가 있습니다.

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

일부 테마는 자체 git 쿼리를 생성하고 때때로 이러한 플래그를 무시합니다 .


4
이 솔루션은 여전히 ​​작동하며 Symfony2 프로젝트 폴더에서 시도했습니다. rake 폴더가 rails 앱에서하는 것처럼 벤더 폴더가 일을 느리게 만드는 것일까 요? zsh는 이제 빠르며 어쨌든 GIT zsh 플러그인이 필요하지 않습니다. 감사!
mblaettermann

이것은 내 문제를 완벽하게 해결했습니다. 다른 리포지토리에서는 여전히 멋진 git-status 비즈니스를 사용할 수 있지만 저의 거대한 파이어 폭스 소스 코드 리포지토리에서는 속도가 느립니다.
Leo Ufimtsev

1
나는을 사용해야했다 oh-my-zsh.hide-dirty. 변경되었거나 내 테마 (agnoster)가 hide-dirty.
Benjamin Atkin

1
vagrant virtualbox vms에 대한 전역 설정에서이 작업을 수행하는 것은 --global여기에 설명 된대로 매우 편리합니다 (게스트에서 느리고 호스트에서 빠름). stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

6
git config --add oh-my-zsh.hide-dirty 1느린 repo에 필요한 전부였습니다.
조나단 엘모어

26

Oh_my_zsh는 각 명령 후 repo의 상태를 확인하기 때문에 일부 repos의 경우 느린 것 같습니다. 이 동작은 .oh_my_zsh의 새 버전에서 재정의 될 수 있습니다. .zshrc에서 다음 줄의 주석 처리를 제거하십시오.

DISABLE_UNTRACKED_FILES_DIRTY = "true"

그런 다음 터미널을 다시 시작하거나 다음을 실행하십시오.

소스 ~ / .zshrc


3
git config --add oh-my-zsh.hide-status 1속도가 빨라지지만 VCS의 zsh 상태를 완전히 제거합니다. 이것은 그것을 유지하고 여전히 속도를 높입니다.
nyxz

1
나는 이것이 트릭을 할 것이라고 기대했지만 소스 ~ / .zshrc 후에도 효과가 없습니다. 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#L17 . DISABLE_UNTRACKED_FILES_DIRTY설정은 단순히 추가 --untracked-files=no받는 플래그를 git status반면, 명령 oh-my-zsh.hide-dirty 1설정은 전체 건너 뜁니다 git status전부 명령을 사용합니다. @JohnathanElmore의 글로벌 자식 구성 설정 제안을 권장합니다.
stwr667

13

저에게는 동기화 된 폴더를 사용하고 있기 때문에 VirtualBox (게스트)에서 느립니다. 충분히 빠른 OS X (호스트)에서 활성화하고 싶습니다. 저장소와 함께 저장되고 게스트와 호스트 모두에서 변경되는 로컬 구성 설정을 사용하는 대신 게스트 에서만 전역 구성 설정을 사용합니다 .

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

단일 리포지토리에 대해서만 원하는 경우 :

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

12

모든 명령 후에 git 및 rvm 항목을 호출하는 테마가 될 수 있습니다.

나를 ZSH_THEME="juanghurtadoto"위해ZSH_THEME="miloshadzic" 모든 명령 후 2 초 지연을 완전히 제거하도록 .

테마는 https://github.com/robbyrussell/oh-my-zsh/wiki/themes 에서 찾을 수 있습니다.


흥미 롭군. +1. 이것은 내 대답보다 더 구체적입니다.
VonC

11

oh-my-zsh" zsh가 엄청나게 느리게 시작됨 "에 자세히 설명 된대로 , 플러그인 섹션을 정리하는 다양한 방법이 있습니다 .

예를 들어 블로그 게시물 " Fix for oh-my-zsh git-svn prompt slowness "에서는이 parse_git_dirty기능을 잠재적 인 문제로 언급합니다 .


그 내용은 무엇을 더 빨리로드 할 수 있는지 알아보기 위해 댓글을 달기 시작하도록 이끌었습니다. 나는 문제를 더 좁히고 내 질문을 업데이트했습니다.
제이슨 Swett

compinit 게시물은 나를 위해 약간 개선되었지만 parse_git_dirty를 제거하면 실제로 작업 속도가 빨라졌습니다. 감사.
Raj

6

나는 마침내 그것을 알아 냈습니다. 내 프로젝트에는 rake수많은 파일 (예 : 20,000 개) 이있는 폴더가 있습니다. 그 폴더가 무엇인지 모르겠지만 삭제했고 Zsh가 더 이상 느리지 않고 내 앱이 여전히 작동하는 것 같습니다.


흥미로운 피드백 (내 답변보다 더 정확함) +1
VonC

5
그리고 알아내는 데 4 개월 밖에 걸리지 않았습니다!
Jason Swett 2013

나는 그것을 빨리 발견한다! 몇 이 걸리는 사람들을 알고 있습니다 ;) 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명령을 사용 하여 저장소의 상태를 확인합니다. 결과적으로 git이 아닌 디렉토리에서 작업하는 것만 큼 빠른 속도로 유용한 git 프롬프트를 볼 수 있습니다. 이 작은 수정으로 내 zsh는 git repos 내에서 4-5 배 빠르게 작업 할 수 있습니다.

참고 : BSD grep이 아닌 GNU 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"

나를 위해 일했습니다. 분명히 터미널 프롬프트에서 git 상태를 잃을 것입니다.

이 테마에 대한 git 옵션은 여기 에서 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.