3

这个问题是基于线程的

我目前有以下 Git 提示。cd转到非 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

我当前在 Zsh 中的 Git-prompt 代码

 # 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 目录中运行它时,我得到了错误。第二个没有吐出错误。

您可以将错误输出重定向到/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 回答