我如何检查我的git存储库中是否有任何未提交的更改:
添加到索引但未提交的更改 无路径的文件
从一个脚本?
git-status在git 1.6.4.2版本中似乎总是返回0。
我如何检查我的git存储库中是否有任何未提交的更改:
添加到索引但未提交的更改 无路径的文件
从一个脚本?
git-status在git 1.6.4.2版本中似乎总是返回0。
当前回答
为什么不封装'git状态与一个脚本:
将分析该命令的输出 是否会根据需要返回适当的错误代码
这样,您就可以在脚本中使用“增强”状态。
正如0xfe在他的精彩回答中提到的,git状态—瓷器在任何基于脚本的解决方案中都是重要的
--porcelain
为脚本提供稳定、易于解析的输出格式。 目前这与——short输出相同,但保证将来不会更改,因此对脚本是安全的。
其他回答
这是一个更加shell友好的变体,用于查找存储库中是否存在任何未跟踪的文件:
# Works in bash and zsh
if [[ "$(git status --porcelain 2>/dev/null)" = *\?\?* ]]; then
echo untracked files
fi
这不会派生第二个进程grep,并且不需要检查您是否在git存储库中。这对于shell提示等很方便。
假设你使用的是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 describe --dirty
. 如果它检测到一个肮脏的工作树,它将在结尾附加单词“-dirty”。根据git-describe(1):
--dirty[=<mark>]
Describe the working tree. It means describe HEAD and appends <mark> (-dirty by default) if
the working tree is dirty.
. 注意:未跟踪的文件不被认为是“脏文件”,因为,正如manpage声明的那样,它只关心工作树。
VonC答案的实现:
if [[ -n $(git status --porcelain) ]]; then echo "repo is dirty"; fi
看了一下这些答案…(在*nix和windows上有各种问题,这是我的要求)…发现以下方法效果很好…
git diff --no-ext-diff --quiet --exit-code
检查*nix中的退出代码
echo $?
#returns 1 if the repo has changes (0 if clean)
查看窗口$中的退出代码
echo %errorlevel%
#returns 1 if the repos has changes (0 if clean)
来源:https://github.com/sindresorhus/pure/issues/115 感谢@paulirish的分享