我正在尝试创建一个Bash脚本,该脚本知道当前工作目录是否有更改。我知道
$ git status
返回“无需提交”等消息。我想要的是将变量定义为true或false。这个布尔值将告诉我是否有变化。
显然我不是bash脚本的专家。我试过这样的事,
there_are_changes=$(git status | grep nothin)
echo $there_are_changes
但它没有按预期工作。我该怎么办?
答案 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。