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

sen*_*rio 6 git bash

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

$ git status
Run Code Online (Sandbox Code Playgroud)

返回"无提交"之类的消息.我想要的是将变量定义为true或false.这个布尔值将告诉我是否有变化.

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

there_are_changes=$(git status | grep nothin)
echo $there_are_changes
Run Code Online (Sandbox Code Playgroud)

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

jub*_*0bs 18

git-diff手册页介绍了这里的相关性两种选择:

--quiet
Disable all output of the program. Implies --exit-code.
Run Code Online (Sandbox Code Playgroud)

--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.
Run Code Online (Sandbox Code Playgroud)

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

git diff --quiet; nochanges=$?
Run Code Online (Sandbox Code Playgroud)

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

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

if [ $nochanges -eq 0 ]; then
    # there are no changes
else
    # there are changes
fi
Run Code Online (Sandbox Code Playgroud)

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

if git diff --quiet; then
    # there are no changes
else
    # there are changes
fi
Run Code Online (Sandbox Code Playgroud)

编辑:因为git diff是一个瓷器Git命令,你想要以编程方式做事,你应该使用调用的管道Git命令git diff-index(它也有一个--quiet标志,但必须提供一个树形参数):

if git diff-index --quiet HEAD; then
    # there are no changes
else
    # there are changes
fi
Run Code Online (Sandbox Code Playgroud)


Aar*_*n D 6

您可以使用表达式检查变量是否已设置-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
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是-z如果为空则返回 True(与 的逻辑相反-n。有关条件表达式的完整列表,请参阅Bash 参考手册