Para conseguir trabajo Git-rápido en Zsh sin un error en una función
Pregunta
Esta pregunta se basa en el hilo .
Tengo el siguiente Git-rápido en el momento.
Me da la siguiente advertencia después de cd
ing a una carpeta no Git.
fatal: Not a git repository (or any of the parent directories): .git
fatal: git diff [--no-index] takes two paths
fatal: Not a git repository (or any of the parent directories): .git
fatal: git diff [--no-index] takes two paths
Mi código actual para Git-rápido en Zsh
# get the name of the branch we are on
git_prompt_info() {
ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
echo $ref
}
get_git_dirty() {
git diff --quiet || echo '*'
}
autoload -U colors
colors
setopt prompt_subst
PROMPT='%{$fg[blue]%}%c %{$fg_bold[red]%}$(git_prompt_info)$(get_git_dirty)%{$fg[blue]%} $ %{$reset_color%}'
El problema es el siguiente código que hace que la advertencia para carpetas no Git
get_git_dirty() {
git diff --quiet || echo '*'
}
He intentado resolver el error mediante la reorientación de errores a / tmp / sin éxito tal que
get_git_dirty() {
git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error
}
¿Cómo puede deshacerse de los mensajes de advertencia para los directorios no git?
Solución
Uso
REL=$(git rev-parse --show-prefix 2>/dev/null) || { echo "$@" ; exit ; }
o
BR=$(git symbolic-ref HEAD 2>/dev/null) || { echo "$@" ; exit ; }
Salir temprano.
Para ser más explícito: no se puede utilizar el código de salida de git diff --quiet
para comprobar si se encuentra en el repositorio de trabajar porque git diff luego "salidas con 1 si había diferencias y 0 significa que no hay diferencias". (Ver git-diff página del manual)
Otros consejos
En realidad, creo que es la primera que está causando el error porque cuando lo ejecuto en un directorio no git, consigo los errores. El segundo no escupir los errores.
Se puede redirigir la salida de error a /dev/null
.
Esto funcionaría en bash, no está seguro acerca zsh pero debe darle una idea de cómo ir.
git_prompt_info() {
ref=$(git symbolic-ref HEAD 2>/dev/null)
if [ ! -z $ref ]; then
newref=$(echo $ref | cut -d'/' -f3)
echo $newref
fi
}
No sé lo que sería más caro, sin embargo, se ejecuta git o atravesar todos los directorios hasta encontrar un directorio .git. Git probablemente hace el recorrido de directorio de todos modos. No estoy seguro.
¿Podría algo así como este trabajo?
get_git_dirty() {
set __MT_OK__=0
if [[ -d .git ]]; then
__MT_OK__=1
fi
while [[ ! -d .git ]]; do
cd ..
if [[ -d .git ]]; then
__MT_OK__=1
break
fi
if [[ $PWD = "/" ]]; then
break
fi
done
if [[ __MT_OK__ -eq 1 ]]; then
git diff --quiet || echo '*'
fi
}
Esto puede no ser la solución más elegante, pero debería funcionar.
Me sale este código de fin de trabajar:
# get the name of the branch we are on
git_prompt_info() {
BR=$(git symbolic-ref HEAD 2>/dev/null | awk -F/ '{ print $3 }') || { echo "$@" ; exit ; }
echo $BR
}
mientras que el resto son los mismos que antes.