oh-my-zsh lento, pero solo para ciertos repositorios de Git


102

Recientemente comencé a usar Zsh y es increíble. Desafortunadamente, para el proyecto que considero mi proyecto "principal", todo es lento. Lo que quiero decir es que cada vez que ejecuto un comando ls, por ejemplo, hay un retraso de cinco segundos entre el momento en que se ejecuta el comando y el momento en que puedo usar el terminal nuevamente.

¿Qué podría ser diferente en este repositorio que hace que Zsh sea tan lento? Supongo que es algo específico de Zsh porque no había ningún problema antes de empezar a usar Zsh. Intenté hacer una git cleanpero no hizo ninguna diferencia notable.

Estoy en Mac OS X si eso importa.

Actualización: resulta que esta línea de mi .zshenves lo que lo estaba haciendo lento:

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

Si comento esa línea, pasa de tardar unos 3 segundos a tardar alrededor de 1 segundo. Desafortunadamente, necesito esa línea, ya que muchos de mis proyectos usan RVM. No sé qué hacer ahora.

Actualización 2 : esto parece ser específicamente una cosa oh-my-zsh. Si no cargo ~/.oh-my-zsh/oh-my-zsh.sh, no tengo ningún problema.


1
y si usa bash ahora, ¿sigue siendo lento?
nneonneo

Excelente pregunta. No, es rápido en bash.
Jason Swett

¿Sigue siendo lento si quita los ~/.z*archivos del camino?
user4815162342

No. Entonces supongo que es algo en uno de esos.
Jason Swett

3
Si el repositorio es grande, llamar a git st cada vez podría ralentizar el shell. Utilice esta opción para apagarlo. git config --add oh-my-zsh.hide-status 1
Senthil Kumar

Respuestas:


172

Puede agregar esto a su configuración de git y zsh ya no verificará el estado

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

Explicación

Hay dos funciones centrales de git en lib / git.zsh :

  • git_prompt_info()
  • parse_git_dirty()

Cada método tiene un conmutador de configuración git para deshabilitarlo:

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

Algunos temas crean sus propias consultas de git y, a veces, ignoran estos indicadores .


4
Esta solución todavía funciona, solo probé esto en mi carpeta de proyecto Symfony2. ¿Quizás la carpeta del proveedor ralentiza las cosas, como lo hace la carpeta rake para las aplicaciones de rieles? zsh es rápido ahora, y no necesito el complemento zsh de GIT de todos modos. ¡Gracias!
mblaettermann

Esto resolvió mi problema perfectamente. Todavía puedo usar el buen negocio de git-status en otros repositorios, pero no en mi enorme repositorio de código fuente de Firefox, donde lo hago lento.
Leo Ufimtsev

1
Tuve que usar oh-my-zsh.hide-dirty. Puede que haya cambiado o quizás mi tema (agnoster) solo respete hide-dirty.
Benjamin Atkin

1
Hacer esto en la configuración global para vagrant virtualbox vms con --globales realmente útil (lento en invitado, rápido en host) como se describe aquí: stackoverflow.com/a/40943155/1092815 <3
GabLeRoux

7
git config --add oh-my-zsh.hide-dirty 1era todo lo que necesitaba para mi repositorio lento.
Johnathan Elmore

26

Oh_my_zsh parece ser lento para algunos repositorios porque verifica el estado del repositorio después de cada comando. Este comportamiento se puede anular en la nueva versión de .oh_my_zsh. Simplemente elimine el comentario de la siguiente línea en .zshrc:

DISABLE_UNTRACKED_FILES_DIRTY = "verdadero"

Después de esto, reinicie su terminal o ejecute lo siguiente:

fuente ~ / .zshrc


3
git config --add oh-my-zsh.hide-status 1acelera las cosas, pero elimina por completo el estado zsh del VCS. Este lo mantiene y aún lo acelera.
nyxz

1
Esperaba que esto hiciera el truco, pero sin efecto, incluso después de la fuente ~ / .zshrc. git config --add oh-my-zsh.hide-dirty 1aunque funcionó para mí. git config --global --add oh-my-zsh.hide-dirty 1para deshabilitar esto para todos los repositorios.
Johnathan Elmore

@JohnathanElmore @Peeyush, DISABLE_UNTRACKED_FILES_DIRTY="true"no hace lo mismo que el oh-my-zsh.hide-dirtyescenario, aunque son similares. Vea el código aquí: github.com/ohmyzsh/ohmyzsh/blob/master/lib/git.zsh#L17 . La DISABLE_UNTRACKED_FILES_DIRTYconfiguración simplemente agrega una --untracked-files=nobandera al git statuscomando, mientras que la oh-my-zsh.hide-dirty 1configuración omitirá todo el git statuscomando por completo. Recomiendo la sugerencia de @ JohnathanElmore de la configuración de configuración global de git.
stwr667

13

Para mí, es lento en VirtualBox (el invitado) porque estoy usando una carpeta sincronizada. Todavía lo quiero habilitado en OS X (el host) donde es lo suficientemente rápido. En lugar de usar una configuración de configuración local que se almacena con el repositorio y la cambiaría tanto en el invitado como en el host, utilizo una configuración de configuración global solo en el invitado :

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

Si lo quiero solo para un solo repositorio:

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

12

Podría ser el tema que llama git y rvm después de cada comando.

Para mí, cambiar ZSH_THEME="juanghurtadoto"a ZSH_THEME="miloshadzic"eliminó el retraso de 2 segundos después de cada comando por completo.

Los temas se pueden encontrar en https://github.com/robbyrussell/oh-my-zsh/wiki/themes


Interesante. +1. Esto es más específico que mi respuesta.
VonC

11

Hay varias formas de acelerar y oh-my-zsh, como se detalla en " zsh comienza increíblemente lento ", limpiando la sección de complementos.

Por ejemplo, la publicación del blog " Solución para la lentitud del indicador de oh-my-zsh git-svn " menciona la parse_git_dirtyfunción como un problema potencial.


Eso ayudó porque me llevó a comenzar a comentar cosas para ver qué podría hacer que las cosas se carguen más rápido. Reduje aún más el problema y actualicé mi pregunta.
Jason Swett

La publicación de compinit mejoró un poco para mí, pero eliminar parse_git_dirty realmente aceleró las cosas. Gracias.
Raj

6

Finalmente lo resolví. Mi proyecto tenía una rakecarpeta con una tonelada de archivos (como 20.000). No tengo idea de para qué estaba esa carpeta, pero la eliminé, Zsh ya no es lento y mi aplicación todavía parece funcionar.


Comentarios interesantes (más precisos que mi respuesta) +1
VonC

5
¡Y solo me tomó 4 meses darme cuenta!
Jason Swett

¡Encuentro así de rápido! Conozco algunos que tardan varios años ;) meta.stackexchange.com/questions/36318/…
VonC

3

Si no le importan otros programas de control de versiones git, puede deshabilitar todos los correos vcs_infoelectrónicos en su *.zsh-themey reemplazarlos con gitcomandos nativos .

Por ejemplo, modifico mi agnoster.zsh-themepor:

  1. comentar / eliminar todas las líneas que tienen vcs_info,
  2. editar código en prompt_git()función desde:

    ref="$vcs_info_msg_0_" a

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

Entonces, básicamente, desactivé todas las vcs_infoacciones y en su lugar utilicé un gitcomando nativo para verificar los estados del repositorio. Como resultado, todavía puedo ver mi útil indicador de git con una velocidad tan rápida como trabajar en un directorio que no sea de git. Con esta pequeña modificación, mi zsh puede funcionar 4-5 veces más rápido dentro de repositorios de git.

Nota: use GNU grep no BSD grep.


1

Las respuestas anteriores no resolvieron mi problema. En mi caso, la función git_prompt_statuslleva demasiado tiempo que otras. Así que modifiqué ~ / .oh-my-zsh / lib / git.zsh, reemplazando la git_prompt_statusfunción con mi versión de retorno temprana:

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
}

Si bien uso ZSH_THEME_GIT_PROMPT_MODIFIED como una marca de indeterminado, puede elegir cualquier estado que desee para indicarlo o implementar una git_prompt_statusfunción mucho más rápida en su caso.


0

Para cualquiera que use el tema de la nave espacial , agregue esto a .zshrc:

SPACESHIP_GIT_STATUS_SHOW="false"

trabajó para mi. Obviamente, perderá el estado de git en el indicador de su terminal.

Las opciones de git para este tema se pueden encontrar aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.