如何检查当前分支中是否没有提交?
目标是获得可以在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-files
和git 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