2009-07-15 5 views
3

Diese Frage basiert auf the thread.Um Git-Prompt-Arbeit in Zsh ohne einen Fehler in einer Funktion zu erhalten

Ich habe die folgende Git-Eingabeaufforderung im Moment. Ich bekomme die folgende Warnung nach cd in einem Nicht-Git-Ordner.

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 

Meine aktuellen Code für Git-prompt in 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%}' 

Das Problem ist der folgende Code, der die Warnung für Nicht-Git Ordner verursacht

get_git_dirty() { 
     git diff --quiet || echo '*'             
    } 

Ich habe versucht, löse den Fehler, indem du Fehler nach/tmp/vergeblich umleitest, so dass

get_git_dirty() { 
      git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error             
    } 

Wie können Sie die Warnmeldungen für Nicht-Git-Verzeichnisse loswerden?

Antwort

2

Verwenden

REL=$(git rev-parse --show-prefix 2>/dev/null) || { echo "[email protected]" ; exit ; } 

oder

BR=$(git symbolic-ref HEAD 2>/dev/null) || { echo "[email protected]" ; exit ; } 

Ausfahrt zu früh.

Um noch deutlicher: Sie nicht Exit-Status von git diff --quiet zu überprüfen, ob Sie sind in Arbeits Repository weil git diff dann verwenden können, „tritt mit 1, wenn es Unterschiede und 0 bedeutet, dass keine Unterschiede.“ (Siehe git-diff manpage)

+0

Wofür stehen 'REL' und' BR'? --- Sind diese Namen in Git eingebaut? –

+0

Ich bekomme die gleiche Fehlermeldung wie mit * seth * s Code. Das deutet darauf hin, dass das Problem immer noch in der Funktion * get_git_dirty * liegt. --- Meine Eingabeaufforderung hat nicht den Zweignamen mit Ihrem Code. Es zeigt nur den Stern an, der anzeigt, dass Sie 'git-add' und' git-commit' brauchen. –

+1

REL und BR sind Variablen, die im Eingabeaufforderungscode für RELative Verzeichnis innerhalb des Projekts und aktuelle BRanch verwendet werden. Der wichtige Teil besteht darin, den git-spezifischen Teil zu beenden, wenn git-symbolic-ref oder git-rev-parse einen von Null verschiedenen Code zurückgeben; git-diff kann nicht auf diese Weise verwendet werden, da der Wert ungleich null für etwas anderes verwendet wird. –

1

Würde so etwas funktionieren?


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 
} 

Dies ist vielleicht nicht die eleganteste Lösung, aber es sollte funktionieren.

+0

Ich erhalte die folgenden Fehlermeldungen mit Ihrem Code 'fatal: Kein git-Repository (oder eines der übergeordneten Verzeichnisse): .git fatal: Kein git-Repository (oder eines der übergeordneten Verzeichnisse): .git'. –

+0

Dies wird die zweite beheben.Sie müssten etwas Ähnliches tun, um das zweite zu beheben. Sie könnten eine dritte Funktion hinzufügen, die meistens diese ist, um festzustellen, ob Sie ein .git-Verzeichnis haben, und es dann aufrufen, bevor Sie git aufrufen. – Mark

+0

@Mark: Ihre Funktion löst den Fehler in git-diff. --- Es ist ziemlich schwierig für mich, deine Funktion zu lesen. Was ist "__MT_OK__"? –

2

Eigentlich denke ich, es ist der erste, der den Fehler verursacht, denn wenn ich es in einem Nicht-Git-Verzeichnis ausführe, bekomme ich die Fehler. Der zweite spuckt die Fehler nicht aus.

Sie könnten die Fehlerausgabe auf /dev/null umleiten.

Dies würde in bash arbeiten, nicht sicher über zsh, aber es sollte Ihnen eine Vorstellung davon geben, wie es geht.

git_prompt_info() { 
    ref=$(git symbolic-ref HEAD 2>/dev/null) 
    if [ ! -z $ref ]; then 
     newref=$(echo $ref | cut -d'/' -f3) 
     echo $newref 
    fi 
} 

Ich weiß nicht, was allerdings teurer wäre, git laufen oder alle Verzeichnisse durchlaufen, bis ein .git Verzeichnis. Git tut wahrscheinlich das Verzeichnis sowieso. Nicht sicher.

+0

Ich sehe immer noch "get_git_dirty" scheint ein Problem zu sein, da ich die folgende Fehlermeldung mit Ihrem Code zu bekommen: fatal: git diff [--no-index] braucht zwei Pfade fatal: git diff [--no- Index] nimmt zwei Wege ". –

+0

Haben Sie etwas in Ihren Aliasen oder .gitrc, das --no-index an git diff übergibt? Ich bekomme diesen Fehler, wenn ich 'git diff - no-index' aufrufen – seth

+0

Und durch .gitrc ich meine .gitconfig – seth

0

ich diesen Code endlich zu arbeiten:

# 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 "[email protected]" ; exit ; } 
    echo $BR 
} 

, während der Rest das gleiche wie zuvor.

+0

Bitte beachten Sie, dass Marks Antwort den zweiten Fehler mit git-diff unter http://stackoverflow.com/questions/1132725/to-get-git-prompt-work-in-zsh löst -ohne-ein-Fehler-in-Funktion/1132837 # 1132837 –

Verwandte Themen