此问题基于the thread。
目前我有以下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 / notccessfully来解决错误
get_git_dirty() {
git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error
}
如何摆脱非git目录的警告消息?
答案 0 :(得分: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可能会进行目录遍历。不确定。
答案 1 :(得分: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联机帮助页)
答案 2 :(得分: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
}
这可能不是最优雅的解决方案,但它应该有效。
答案 3 :(得分: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
}
其余的与以前相同。