我如何检查我的git存储库中是否有任何未提交的更改:
添加到索引但未提交的更改 无路径的文件
从一个脚本?
git-status在git 1.6.4.2版本中似乎总是返回0。
我如何检查我的git存储库中是否有任何未提交的更改:
添加到索引但未提交的更改 无路径的文件
从一个脚本?
git-status在git 1.6.4.2版本中似乎总是返回0。
当前回答
这个帖子可能会有更好的答案组合。但这对我有用……对于你的.gitconfig的[alias]部分…
# git untracked && echo "There are untracked files!"
untracked = ! git status --porcelain 2>/dev/null | grep -q "^??"
# git unclean && echo "There are uncommited changes!"
unclean = ! ! git diff --quiet --ignore-submodules HEAD > /dev/null 2>&1
# git dirty && echo "There are uncommitted changes OR untracked files!"
dirty = ! git untracked || git unclean
其他回答
一个DIY的可能性,更新遵循0xfe的建议
#!/bin/sh
exit $(git status --porcelain | wc -l)
正如Chris Johnsen所指出的,这只适用于Git 1.7.0或更新版本。
假设你使用的是git 1.7.0或更高版本…
在阅读了本页上的所有答案并进行了一些实验后,我认为将正确性和简洁性正确结合的方法是:
test -n "$(git status --porcelain)"
虽然git允许在跟踪、忽略、未跟踪但未忽略等内容之间有很多细微差别,但我相信典型的用例是用于自动化构建脚本,如果签出不干净,您希望停止所有内容。
在这种情况下,模拟程序员将要做的事情是有意义的:键入git status并查看输出。但我们不想依赖于特定的单词显示,所以我们使用了1.7.0中引入的——porcelain模式;启用干净目录时,不会产生任何输出。
然后使用test -n查看是否有输出。
如果工作目录是干净的,该命令将返回1,如果有要提交的更改,则返回0。你可以把-n改成-z。这对于将其链接到脚本中的命令非常有用。例如:
test -z "$(git status --porcelain)" || red-alert "UNCLEAN UNCLEAN"
这实际上是在说“要么不需要做出改变,要么就会拉响警报”;这个一行语句可能比if语句更可取,这取决于您正在编写的脚本。
我使用最简单的自动测试来检测脏状态=任何更改,包括未跟踪的文件:
git add --all
git diff-index --exit-code HEAD
备注:
如果没有add——all, diff-index不会注意到未跟踪的文件。 通常情况下,我在测试错误代码后运行git重置来取消所有内容。 考虑用quiet代替exit-code来避免输出。
我经常需要一种简单的方法让构建失败,如果在执行结束时有任何被修改的跟踪文件或任何未被忽略的未跟踪文件。
这对于避免构建产生剩余的情况非常重要。
到目前为止,我使用的最好的命令是这样的:
test -z "$(git status --porcelain | tee /dev/fd/2)" || \
{{ echo "ERROR: git unclean at the end, failing build." && return 1 }}
它可能看起来有点复杂,如果有人能找到一个短的变种,我会很感激 保持所期望的行为:
如果一切正常,则没有输出和成功退出代码 如果失败,退出代码1 stderr上的错误消息解释了它失败的原因 显示导致失败的文件列表,再次stderr。
这是一个更加shell友好的变体,用于查找存储库中是否存在任何未跟踪的文件:
# Works in bash and zsh
if [[ "$(git status --porcelain 2>/dev/null)" = *\?\?* ]]; then
echo untracked files
fi
这不会派生第二个进程grep,并且不需要检查您是否在git存储库中。这对于shell提示等很方便。