Pergunta

Esta questão é baseado em o fio .

Eu tenho o seguinte Git-alerta no momento. Eu recebo o seguinte aviso depois cding 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top