目标是获得可以在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与简单的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以使其静默。

其他回答

我在一个脚本中使用这个:

当一切都干净的时候 1 .当存在差异或未跟踪文件时 [-z "$(git状态-瓷器)"]

可以将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 )

将解释这一点;)

在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
}

这个片段展示了如何使用git diff-files和git diff-index来查找之前已知的文件是否有任何更改。但是,它不允许您发现一个新的未知文件是否已添加到工作树中。

虽然不漂亮,但很管用:

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

不确定消息是否依赖于区域设置,所以可能会在前面放一个LANG=C。