Development Tip

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

yourdevel 2020. 10. 31. 10:15
반응형

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


나는 최근에 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하지 않으면 문제가 없습니다.


이것을 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 쿼리를 생성하고 때때로 이러한 플래그를 무시합니다 .


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

DISABLE_UNTRACKED_FILES_DIRTY = "true"

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

소스 ~ / .zshrc


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

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


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

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

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


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

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

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

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

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


다른 버전 관리 프로그램에 대해 걱정하지만하지 않는 경우 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을 사용하십시오.


위의 답변으로는 문제가 해결되지 않았습니다. 제 경우에는 다른 기능 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귀하의 경우에 훨씬 더 빠른 기능을 구현할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/12765344/oh-my-zsh-slow-but-only-for-certain-git-repo

반응형