5

如何在脚本中检查是否存在本地更改?也许结合git describe?

4

4 回答 4

9

从 git 1.6.6 开始,git-describe已经接受了一个--dirty选项。如果您的工作树中有未提交的更改,那么您将获得如下输出:

$ git describe --dirty
1.0.2-2-g215081f-dirty
于 2011-03-03T15:15:34.910 回答
3

您需要确保同时满足以下两个属性:

  1. HEAD和索引缓存没有区别

    git diff-index --cached HEAD

  2. 索引和工作树之间没有区别:

    git diff-files

这两个命令都带有一个--quiet参数,该参数将根据是否存在差异来设置退出代码(在 git 1.4 之后的某个时间开始)。如果你需要让它在 git 1.4 上运行,你需要在没有的情况下运行命令--quiet并检查它们是否产生任何输出。

注意: git diff是一个瓷器命令,因此不应在脚本中使用。请改用上述管道命令。

示例 shell 代码,取自我的git_version.sh 脚本

git_dirty=yes
# git-1.4 does not understand "git-diff-files --quiet"
# git-1.4 does not understand "git-diff-index --cached --quiet HEAD"
if [ "x$($GIT diff-files)" = "x" ] && [ "x$($GIT diff-index --cached HEAD)" = "x" ]; then
    git_dirty=no
fi

如果你可以要求 git 版本 >= 1.5,if git diff-files --quiet && git diff-index --quiet --cached HEAD; then可以替换上面的比较。

注意:此解决方案(与 Antony 的 interactive 完全一样git diff HEAD --quiet)仅发现相对于 HEAD的局部变化。但是,本地提交也可以被认为是本地更改,并且自然不会出现在与 HEAD 的任何差异中。您将需要检查 SHA1 值git describe用于检测 HEAD 是否来自您认为不是本地更改的一组提交。

于 2010-01-01T17:46:34.803 回答
1

git diff --quiet如果有更改则返回退出状态 1,如果没有则返回 0。

请记住,它将显示分阶段更改和工作目录之间的差异。如果您对 HEAD 和工作目录之间的更改感兴趣,您应该使用git diff HEAD --quiet.

--quiet暗示--exit-code

于 2009-12-31T13:35:09.640 回答
0

git status如果没有本地更改,则以非零状态退出。

但我不明白你的意思是“与 git describe 结合”。

于 2009-12-31T13:04:45.690 回答