在Makefile中,如果有未提交的更改(在工作树或索引中),我希望执行某些操作。最干净、最有效的方法是什么?在一种情况下退出时返回值为零,而在另一种情况下返回值为非零的命令适合我的目的。
我可以运行git状态并通过grep管道输出,但我觉得一定有更好的方法。
在Makefile中,如果有未提交的更改(在工作树或索引中),我希望执行某些操作。最干净、最有效的方法是什么?在一种情况下退出时返回值为零,而在另一种情况下返回值为非零的命令适合我的目的。
我可以运行git状态并通过grep管道输出,但我觉得一定有更好的方法。
当前回答
我创建了一些方便的git别名来列出非暂存和暂存文件:
git config --global alias.unstaged 'diff --name-only'
git config --global alias.staged 'diff --name-only --cached'
然后你可以轻松地做以下事情:
[[ -n "$(git unstaged)" ]] && echo unstaged files || echo NO unstaged files
[[ -n "$(git staged)" ]] && echo staged files || echo NO staged files
你可以通过在PATH的某个地方创建一个名为git-has的脚本来让它更具可读性:
#!/bin/bash
[[ $(git "$@" | wc -c) -ne 0 ]]
现在上面的例子可以简化为:
git has unstaged && echo unstaged files || echo NO unstaged files
git has staged && echo staged files || echo NO staged files
为了完整起见,这里为未跟踪和忽略的文件提供了类似的别名:
git config --global alias.untracked 'ls-files --exclude-standard --others'
git config --global alias.ignored 'ls-files --exclude-standard --others --ignored'
其他回答
这是最好、最干净的方法。
function git_dirty {
text=$(git status)
changed_text="Changes to be committed"
untracked_files="Untracked files"
dirty=false
if [[ ${text} = *"$changed_text"* ]];then
dirty=true
fi
if [[ ${text} = *"$untracked_files"* ]];then
dirty=true
fi
echo $dirty
}
正如在另一个回答中指出的那样,这样简单的命令就足够了:
git diff-index --quiet HEAD --
如果省略最后两个破折号,如果文件名为HEAD,则命令将失败。
例子:
#!/bin/bash
set -e
echo -n "Checking if there are uncommited changes... "
trap 'echo -e "\033[0;31mFAILED\033[0m"' ERR
git diff-index --quiet HEAD --
trap - ERR
echo -e "\033[0;32mAll set!\033[0m"
# continue as planned...
警告:此命令忽略未跟踪的文件。
扩展@Nepthar的回答:
if [[ -z $(git status -s) ]]
then
echo "tree is clean"
else
echo "tree is dirty, please commit changes before running this"
exit
fi
Git diff——exit-code如果有任何变化将返回非零;Git diff——quiet是相同的,没有输出。由于您希望检查工作树和索引,请使用
git diff --quiet && git diff --cached --quiet
Or
git diff --quiet HEAD
其中任何一个都将告诉您是否存在暂存的未提交更改。
我创建了一些方便的git别名来列出非暂存和暂存文件:
git config --global alias.unstaged 'diff --name-only'
git config --global alias.staged 'diff --name-only --cached'
然后你可以轻松地做以下事情:
[[ -n "$(git unstaged)" ]] && echo unstaged files || echo NO unstaged files
[[ -n "$(git staged)" ]] && echo staged files || echo NO staged files
你可以通过在PATH的某个地方创建一个名为git-has的脚本来让它更具可读性:
#!/bin/bash
[[ $(git "$@" | wc -c) -ne 0 ]]
现在上面的例子可以简化为:
git has unstaged && echo unstaged files || echo NO unstaged files
git has staged && echo staged files || echo NO staged files
为了完整起见,这里为未跟踪和忽略的文件提供了类似的别名:
git config --global alias.untracked 'ls-files --exclude-standard --others'
git config --global alias.ignored 'ls-files --exclude-standard --others --ignored'