我如何以编程方式(在shell脚本中)确定是否有更改?

时间:2015-02-27 18:49:04

标签: git bash

我正在尝试创建一个Bash脚本,该脚本知道当前工作目录是否有更改。我知道

$ git status

返回“无需提交”等消息。我想要的是将变量定义为true或false。这个布尔值将告诉我是否有变化。

显然我不是bash脚本的专家。我试过这样的事,

there_are_changes=$(git status | grep nothin)
echo $there_are_changes

但它没有按预期工作。我该怎么办?

2 个答案:

答案 0 :(得分:18)

git-diff man page在此处描述了两个相关选项:

--quiet
Disable all output of the program. Implies --exit-code.

--exit-code
Make the program exit with codes similar to diff(1). That is, it
exits with 1 if there were differences and 0 means no differences.

因此,一种强有力的方法是运行

git diff --quiet; nochanges=$?

如果没有变化,shell变量nochanges将等于0(即为真),否则将为1(即为假)。

然后,您可以在条件语句中使用nochanges的值,如下所示:

if [ $nochanges -eq 0 ]; then
    # there are no changes
else
    # there are changes
fi

或者,如果您不需要将退出状态存储在变量中,则可以执行以下操作:

if git diff --quiet; then
    # there are no changes
else
    # there are changes
fi

编辑:由于git diff是一个瓷器Git命令,并且您希望以编程方式执行操作,因此您应该使用名为git diff-index的管道Git命令(也可以一个--quiet标志,但必须提供一个树形参数):

if git diff-index --quiet HEAD; then
    # there are no changes
else
    # there are changes
fi

答案 1 :(得分:3)

您可以使用-n表达式检查变量是否已设置。

#!/bin/bash
CHANGESTOCOMMIT=$(git status | grep 'Changes to be com')
UNSTAGEDCHANGES=$(git status | grep 'Changes not staged')

# If there are staged changes:
if [ -n "$CHANGESTOCOMMIT" ]; then
    echo "Changes need to be committed"
fi
if [ -n "$UNSTAGEDCHANGES" ]; then
    echo "Changes made but not staged."
fi

Git跟踪已提交的已更改文件以及未提交的文件,因此您的脚本可能要检查两个选项(或不检查)。 -n运算符检查变量是否已设置 - 如果变量为空,则返回false。

另一种选择是-z,如果它是空的,则返回True(与-n的逻辑相反。。有关条件表达式的完整列表,请参阅the Bash Reference Manual