我刚刚发现了这个--dirty
选项git describe
,它看起来应该做一些非常有用的事情,即git describe
在工作树脏时的输出中附加一个后缀,但是在我的一些存储库中似乎并非如此:
$ git status
# On branch 8.30
nothing to commit (working directory clean)
$ git describe --dirty
8.30rel-8-g9c1cbdb-dirty
我认为这可能是因为工作目录相对于 tag很脏,但似乎也不是这样:
$ git status
# On branch 1.4
nothing to commit (working directory clean)
$ git describe --tags --dirty --long
1.4rel-0-gfedfe66-dirty
hg id
当我使用 Mercurial时,我曾经广泛使用过,并且喜欢它的默认行为是为+
它为脏存储库报告的任何提交哈希添加后缀,因此一直在寻找git
等效的东西,但git describe --dirty
没有t 似乎做了我所期望的文档:
--dirty[=<mark>] Describe the working tree. It means describe HEAD and appends <mark> (-dirty by default) if the working tree is dirty.
我是否误解了--dirty
应该做什么,或者我没有正确使用它?
万一有什么不同,所有的 git 存储库都通过buckminster部署,因此不涉及子模块,文件系统是nfs
共享的。
更新:我发现了一种解决方法,但我完全不知道这可能会产生什么影响。
如果我git diff --quiet HEAD
在 repo 上运行,那么突然之间就会git describe
像我预期的那样工作:
$ git status
# On branch 8.30
nothing to commit (working directory clean)
$ git describe --dirty
8.30rel-8-g9c1cbdb-dirty
$ git diff --quiet HEAD
$ git describe --dirty
8.30rel-8-g9c1cbdb
我还发现,当git describe
报告存储库dirty
时,gitk
还显示“本地未提交的更改,未签入索引”,然后列出工作目录中的每个文件,但没有针对它们的差异,只有---- filename ----
行。
进一步更新:由于这仍然是一个问题,我最终编写了一个git-describe-dirty
脚本,该脚本首先运行,git describe --dirty
但如果它发现存储库很脏,则git update-index -q --refresh
在再次尝试并获取第二个结果之前运行。
当迭代数百个存储库时,与每次git describe-dirty
运行相比,使用并仅运行最初表明它是脏的存储库的索引更新可以节省大量git update-index -q --refresh ; git describe --dirty
时间。