目标是获得可以在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 diff --quiet --cached

或者这是明确的:

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

地点:

—退出代码

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

——安静

禁用程序的所有输出。暗示—退出代码

其他回答

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

1)对现有文件的更改 2)新增文件 3)删除文件

而且特别不想知道那些无法追踪的文件。

这应该做到:

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

下面是我的bash代码,用于在回购干净时退出脚本。它使用了untracked files选项的简写版本:

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

除了其他解决方案,您还可以使用单独的命令(使用git日志范围),在获取后告诉您需要拉,和/或您需要推。

如果你需要编写脚本:

[ "$(git log ..origin/main)" == "" ] || (
  echo "something new on main"
  .. pull ?
)
[ "$(git rev-list origin/main..)" == "" ] || (
  echo "something new local"
  .. push ?
)

本文中有更多详细信息

git status的返回值只是告诉你git状态的退出码,而不是是否有任何修改要提交。

如果您想要一个计算机可读的git状态输出版本,请尝试

git status --porcelain

有关git状态的更多信息,请参见git状态的描述。

示例使用(脚本简单地测试git状态—porcelain提供任何输出,不需要解析):

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

请注意,你必须引用字符串来测试,即git状态的输出——瓷器。有关测试结构的更多提示,请参阅高级Bash脚本编写指南(部分字符串比较)。

可以将git status—porcelain与简单的grep结合起来执行测试。

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

在grep命令中添加-qs以使其静默。

我在讨论中有点晚了,但如果只是你需要有一个退出码为0 if git状态-瓷器不返回任何东西和!= 0 else,试试这个:

exit $( git status --porcelain | wc -l )

这将使行数成为退出代码,在超过255行的情况下可能会出现问题。所以

exit $( git status --porcelain | head -255 | wc -l )

将解释这一点;)