我正在尝试创建一个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)
您可以使用表达式检查变量是否已设置-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 参考手册。
归档时间: |
|
查看次数: |
1544 次 |
最近记录: |