我刚刚发现了这个--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时间。