Domanda

Questa domanda si basa su il filo .

Ho il seguente Git-pronta al momento. Ottengo il seguente avviso dopo cding 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top