如何检查当前分支中是否没有提交?

目标是获得可以在shell命令中评估的明确状态。

我试过git status但它总是返回0,即使有项目提交。

 git status echo $? #this is always 0 

我有一个想法,但我认为这是一个不好的主意。

 if [ git status | grep -i -c "[az]"> 2 ]; then code for change... else code for nothing change... fi 

任何其他方式?


更新,现在这个解决scheme看看Mark Longair的post

我试过这个,但是造成了一个问题。

 if [ -z $(git status --porcelain) ]; then echo "IT IS CLEAN" else echo "PLEASE COMMIT YOUR CHANGE FIRST!!!" echo git status fi 

当。。。的时候

它会得到一些错误,[:??:二元运算符的预期

现在,我正在看人,并尝试git diff。

===================代码为我的希望,希望能更好的回答======================

 #if [ `git status | grep -i -c "$"` -lt 3 ]; # change to below code,although the above code is simple, but I think it is not strict logical if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ]; then echo "PLEASE COMMIT YOUR CHANGE FIRST!!!" exit 1 else exit 0 fi 

testinggit status --porcelain输出是否为空的另一种方法是分别testing每个您关心的情况。 例如,可能并不总是在乎git status的输出中是否有未跟踪的文件。

例如,要查看是否有任何本地暂停的更改,可以查看以下代码的返回代码:

 git diff --exit-code 

要检查是否有任何更改已经执行但未提交,可以使用以下代码的返回码:

 git diff --cached --exit-code 

最后,如果您想知道工作树中是否有未被忽略的未被忽略的文件,您可以testing下列命令的输出是否为空:

 git ls-files --other --exclude-standard --directory 

更新:下面问您是否可以更改该命令以排除输出中的目录。 您可以通过添加--no-empty-directory来排除--no-empty-directory ,但要排除该输出中的所有目录,我认为您必须过滤输出,例如:

 git ls-files --other --exclude-standard --directory | egrep -v '/$' 

egrep-v表示仅输出与模式不匹配的行,模式匹配任何以/结尾的行。

git status的返回值只是告诉你git status的退出码,而不是如果有任何修改被提交。

如果你想要一个更加计算机可读的git status输出版本,请尝试

 git status --porcelain 

有关更多信息,请参阅git status的描述。

示例使用(脚本简单地testing,如果git status --porcelain给出任何输出,不需要parsing):

 if [ -n "$(git status --porcelain)" ]; then echo "there are changes"; else echo "no changes"; fi 

请注意,您必须引用要testing的string,即git status --porcelain的输出。 有关testing结构的更多提示,请参阅高级Bash脚本指南 (部分string比较 )。

如果你像我一样,你想知道是否有:

1)改变现有文件2)新增文件3)删除文件

特别是不想知道约4)未跟踪的文件。

这应该做到这一点:

 git status --untracked-files=no --porcelain 

这是我的bash代码退出脚本,如果回购是干净的。 它使用未跟踪文件选项的简短版本:

 [[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$; 

可以将git status --porcelain一个简单的grep进行testing。

 if git status --porcelain | grep .; then echo Repo is dirty else echo Repo is clean fi 

我有时候把它当作一个简单的单线程来使用:

 # pull from origin if our repo is clean git status --porcelain | grep . || git pull origin master 

-qs添加到您的grep命令以使其保持沉默。

从git源代码有一个sh脚本,其中包括以下内容。

 require_clean_work_tree () { git rev-parse --verify HEAD >/dev/null || exit 1 git update-index -q --ignore-submodules --refresh err=0 if ! git diff-files --quiet --ignore-submodules then echo >&2 "Cannot $1: You have unstaged changes." err=1 fi if ! git diff-index --cached --quiet --ignore-submodules HEAD -- then if [ $err = 0 ] then echo >&2 "Cannot $1: Your index contains uncommitted changes." else echo >&2 "Additionally, your index contains uncommitted changes." fi err=1 fi if [ $err = 1 ] then test -n "$2" && echo >&2 "$2" exit 1 fi } 

这个sniplet显示了如何使用git diff-filesgit diff-index来查看是否有任何对以前已知文件的更改。 但是,它不允许您查看是否有新的未知文件已添加到工作树中。

我会做这个testing:

 git diff --quiet --cached 

或者这是明确的:

 git diff --quiet --exit-code --cached 

哪里:

–exit码

用类似于diff(1)的代码退出程序。 也就是说,如果存在差异,则1退出,0表示没有差异。

– 安静

禁用程序的所有输出。 意味着 – 出口代码

不漂亮,但工程:

 git status | grep -qF 'working directory clean' || echo "DIRTY" 

不知道该消息是否依赖于语言环境,因此可能会在前面加上LANG=C