3

この質問はスレッドに基づいています。

現在、次の Git プロンプトがあります。cdGit 以外のフォルダーに移動した後、次の警告が表示されます。

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

Zsh の Git プロンプトの現在のコード

 # 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%}'

問題は、非 Git フォルダーの警告を引き起こす次のコードです。

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

エラーを /tmp/ にリダイレクトすることでバグを解決しようとしましたが失敗しました

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

非 git ディレクトリの警告メッセージを取り除くにはどうすればよいですか?

4

4 に答える 4

2

実際、git以外のディレクトリで実行するとエラーが発生するため、エラーを引き起こしているのは最初のものだと思います。2番目のものはエラーを吐き出しません。

エラー出力を にリダイレクトできます/dev/null

これはbashで機能しますが、zshについてはわかりませんが、どうすればよいかがわかります。

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

ただし、git を実行するか、.git ディレクトリが見つかるまですべてのディレクトリをトラバースすると、何がより高価になるかはわかりません。とにかく、Gitはおそらくディレクトリトラバーサルを行います。わからない。

于 2009-07-15T17:54:09.353 に答える
2

使用する

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

また

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

早めに出てください。

より明確に言うとgit diff --quiet、 git diff は「違いがあった場合は 1 で終了し、0 は違いがないことを意味する」ため、作業中のリポジトリにいるかどうかを確認するために終了ステータスを使用することはできません。( git-diffマンページを参照)

于 2009-07-15T21:18:44.947 に答える
1

このようなものは機能しますか?


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
}

これは最も洗練されたソリューションではないかもしれませんが、うまくいくはずです。

于 2009-07-15T17:39:27.667 に答える
0

私は最終的にこのコードを動作させます:

 # 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
 }

残りは以前と同じですが。

于 2009-07-16T00:35:33.947 に答える