目标是获得可以在shell命令中计算的明确状态。
我尝试了git状态,但它总是返回0,即使有项目提交。
git status
echo $? #this is always 0
我有一个主意,但我认为这是一个相当糟糕的主意。
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
还有别的办法吗?
更新以下解决方案,请参阅Mark Longair的帖子
我试过了,但它引起了一个问题。
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
我得到以下错误[:??:二进制运算符
现在,我看着这个人,试着改变一下。
=================== 我希望代码,希望更好的答案 ======================
#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
测试git status—porcelain的输出是否为空的另一种方法是分别测试您关心的每个条件。人们可能并不总是关心,例如,在git状态的输出中是否有未跟踪的文件。
例如,要查看是否有任何局部的非阶段性变化,您可以查看的返回代码:
git diff --exit-code
要检查是否有任何暂存但未提交的更改,您可以使用的返回代码:
git diff --cached --exit-code
最后,如果你想知道你的工作树中是否有未被忽略的未跟踪文件,你可以测试以下命令的输出是否为空:
git ls-files --other --exclude-standard --directory
更新:您在下面询问是否可以更改该命令以排除输出中的目录。你可以通过添加——no-empty-directory来排除空目录,但要排除输出中的所有目录,我认为你必须过滤输出,例如:
git ls-files --other --exclude-standard --directory | egrep -v '/$'
对egrep使用-v表示只输出与模式不匹配的行,并且模式匹配以/结尾的任何行。
测试git status—porcelain的输出是否为空的另一种方法是分别测试您关心的每个条件。人们可能并不总是关心,例如,在git状态的输出中是否有未跟踪的文件。
例如,要查看是否有任何局部的非阶段性变化,您可以查看的返回代码:
git diff --exit-code
要检查是否有任何暂存但未提交的更改,您可以使用的返回代码:
git diff --cached --exit-code
最后,如果你想知道你的工作树中是否有未被忽略的未跟踪文件,你可以测试以下命令的输出是否为空:
git ls-files --other --exclude-standard --directory
更新:您在下面询问是否可以更改该命令以排除输出中的目录。你可以通过添加——no-empty-directory来排除空目录,但要排除输出中的所有目录,我认为你必须过滤输出,例如:
git ls-files --other --exclude-standard --directory | egrep -v '/$'
对egrep使用-v表示只输出与模式不匹配的行,并且模式匹配以/结尾的任何行。