4

我正在使用我在某处网上找到的 bash 脚本,它无处不在,用于显示当前的 git 分支。

function parse_git_dirty {
  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
}
function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/"
}

export PS1='\w\[\033[1;37m\]$(parse_git_branch)\[\e[0m\]$ '

这在我的 Mac 上运行良好。但我最近买了一台新 Mac,并通过备份传递了我所有的数据。但是在我的新机器上,分支状态似乎总是很脏。

# On branch master
nothing to commit, working directory clean
~/Desktop/Work/relearning_rails[master*]$

这是 git status 的结果。我这辈子都想不通。我必须更改此脚本中的某些内容吗?

4

2 回答 2

4

它正在寻找的字符串是错误的。 parse_git_dirty应该是这样的:

function parse_git_dirty {
  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working directory clean" ]] && echo "*"
}

更好的实现可能是这样的:

function parse_git_dirty {
  [[ -n "$(git status -s 2> /dev/null)" ]] && echo "*"
}

此版本将依赖于是否返回任何数据,而不是检查数据。

你可能想考虑看看git-prompt.sh。这是一个更完整的提示。关于如何使用它的说明在脚本本身中。

于 2013-09-25T19:40:19.207 回答
0

contrib/completion/git-prompt.sh对于git 2.6.4 或 2.7(2015 年 12 月)变得更加健壮:

git diff --no-ext-diff --quiet || w="*"
git diff --no-ext-diff --cached --quiet || i="+"
if [ -z "$short_sha" ] && [ -z "$i" ]; then
    i="#"
fi

请参阅SZEDER Gábor ( )的提交 c26f70c提交 0af9f7e提交 a30d11e(2015 年 11 月 21 日) 。(由Junio C Hamano 合并 -- --80c17ca 提交中,2015 年 12 月 4 日)szeder
gitster

bash 提示:即使在孤立分支上也指示脏索引

__git_ps1()在孤立分支上时不指示脏索引。

要检查索引的脏污程度,请__git_ps1()运行“ git diff-index --cached ... HEAD”,这在孤立分支上不起作用,因为HEAD它没有指向有效的提交。

运行 ' git diff ... --cached' 代替,因为它在 valid 和 invalid 上都做正确的事情HEAD,即将索引与前一种情况下的现有 HEAD 和后一种情况下的空树进行比较。
这修复了本系列第一次提交中添加的两个失败测试。

工作树的脏污程度已经用 ' git diff' 进行了检查,即使在孤立的分支上也能正确显示。

于 2015-12-06T18:55:18.170 回答