Para começar o trabalho Git-rápido na Zsh sem um bug em uma função
Pergunta
Esta questão é baseado em o fio .
Eu tenho o seguinte Git-alerta no momento.
Eu recebo o seguinte aviso depois cd
ing para uma pasta não 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
Meu código atual para Git-rápido na 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%}'
O problema é o seguinte código que faz com que o aviso para pastas não-Git
get_git_dirty() {
git diff --quiet || echo '*'
}
Eu tentei resolver o bug, redirecionando erros para / tmp / sem sucesso tal que
get_git_dirty() {
git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error
}
Como você pode se livrar das mensagens de aviso para os diretórios não-git?
Solução
Use
REL=$(git rev-parse --show-prefix 2>/dev/null) || { echo "$@" ; exit ; }
ou
BR=$(git symbolic-ref HEAD 2>/dev/null) || { echo "$@" ; exit ; }
Sair cedo.
Para ser mais explícito: você não pode usar estado de saída de git diff --quiet
para verificar se você está no repositório trabalhando porque git diff então "saídas com 1 se não houvesse diferenças e 0 significa ausência de diferenças" (Veja git-diff manpage)
Outras dicas
Na verdade, eu acho que é o primeiro que está causando o erro, porque quando eu executá-lo em um diretório não-git, eu recebo os erros. O segundo não cuspir os erros.
Você pode redirecionar a saída de erro para /dev/null
.
Isso poderia funcionar no bash, não tenho certeza sobre zsh mas deve dar uma idéia de como 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
}
Eu não sei o que seria mais caro, porém, executando git ou percorrendo todos os diretórios até encontrar um diretório .git. Git provavelmente faz a passagem de diretório de qualquer maneira. Não tenho certeza.
Será que algo como isso funciona?
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
}
Esta pode não ser a solução mais elegante, mas deve funcionar.
Eu recebo este código finalmente ao trabalho:
# 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
}
enquanto o resto são os mesmos de antes.