解析输出git status
不是一个好主意,因为该输出是人类可读的,而不是机器可读的。不能保证在将来的Git版本或不同配置的环境中输出将保持不变。
UVV的注释处于正确的轨道上,但是不幸的是git status
,当存在未提交的更改时,的返回代码不会更改。它,然而,提供的--porcelain
选项,这将导致输出git status --porcelain
在一个易于解析格式的脚本进行格式化,并且将整个版本的Git保持稳定,而不管用户配置的。
我们可以将的空输出git status --porcelain
用作没有更改要提交的指示符:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
如果我们不在乎工作目录中的未跟踪文件,则可以使用该--untracked-files=no
选项来忽略这些文件:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
为了使这种方法在没有输出到的情况下实际上会导致git status
失败的情况下更加可靠stdout
,我们可以将检查优化为:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
还值得注意的是,尽管git status
在工作目录不干净时不会给出有意义的退出代码,但git diff
提供了--exit-code
选项,使其行为与diff实用程序相似,即1
在存在差异0
且未找到差异时以状态退出。
使用此方法,我们可以使用以下方法检查未进行的变更:
git diff --exit-code
并通过以下方式进行但未提交的更改:
git diff --cached --exit-code
尽管git diff
可以通过适当的参数来报告子模块中未跟踪的文件--ignore-submodules
,但是不幸的是,似乎没有办法在实际工作目录中报告未跟踪的文件。如果工作目录中的未跟踪文件相关,git status --porcelain
则可能是最好的选择。