Per ottenere il lavoro Git-prompt Zsh senza un errore in una funzione
Domanda
Questa domanda si basa su il filo .
Ho il seguente Git-pronta al momento.
Ottengo il seguente avviso dopo cd
ing in una cartella non-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
Il mio codice corrente per Git-prompt 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%}'
Il problema è il seguente codice che causa l'avviso per le cartelle non Git
get_git_dirty() {
git diff --quiet || echo '*'
}
Ho cercato di risolvere il bug reindirizzando gli errori a / tmp / senza successo tale che
get_git_dirty() {
git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error
}
Come si può sbarazzarsi dei messaggi di avviso per le directory non-git?
Soluzione
Usa
REL=$(git rev-parse --show-prefix 2>/dev/null) || { echo "$@" ; exit ; }
o
BR=$(git symbolic-ref HEAD 2>/dev/null) || { echo "$@" ; exit ; }
uscita anticipata.
Per essere più espliciti: non è possibile utilizzare lo stato di uscita del git diff --quiet
per verificare se si è in repository git diff lavorare perché poi "uscite con 1 se non ci fossero differenze e 0 significa nessuna differenza." (Vedi git-diff pagina man)
Altri suggerimenti
In realtà, penso che sia il primo che sta causando l'errore perché quando l'eseguo in una directory non-git, ottengo gli errori. Il secondo non sputare fuori gli errori.
Si potrebbe reindirizzare l'output di errore a /dev/null
.
Questo potrebbe funzionare in bash, non sono sicuro di zsh ma dovrebbe darvi un'idea di come andare.
git_prompt_info() {
ref=$(git symbolic-ref HEAD 2>/dev/null)
if [ ! -z $ref ]; then
newref=$(echo $ref | cut -d'/' -f3)
echo $newref
fi
}
Non so cosa sarebbe più costoso, in esecuzione git o attraversare tutte le directory fino a trovare una directory .git. Git probabilmente fa l'attraversamento directory in ogni modo. Non è sicuro.
Sarebbe qualcosa di simile a questo lavoro?
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
}
Questa non può essere la soluzione più elegante, ma dovrebbe funzionare.
Ottengo questo codice finalmente al lavoro:
# 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
}
, mentre il resto sono gli stessi di prima.