--dirty
选项,它可以在git describe
的输出中添加后缀,用于指示工作树是否有更改。但是,在我的一些存储库中似乎并不起作用。$ git status
# On branch 8.30
nothing to commit (working directory clean)
$ git describe --dirty
8.30rel-8-g9c1cbdb-dirty
我认为这可能是因为工作目录相对于标记 而言不干净,但实际上情况并非如此:
$ git status
# On branch 1.4
nothing to commit (working directory clean)
$ git describe --tags --dirty --long
1.4rel-0-gfedfe66-dirty
我曾经使用Mercurial时广泛使用hg id
,并喜欢它的默认行为是向任何报告脏库的提交哈希添加+
后缀,因此一直在寻找git
的等效命令,但根据文档,git describe --dirty
似乎没有达到我的期望:
--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
,那么突然间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
也会显示“本地未提交的更改,未检入索引”,然后列出工作目录中的每个文件,但没有与它们的差异,只有---- 文件名 ----
行。
进一步更新: 由于这一问题持续存在,我最终编写了一个名为
git-describe-dirty
的脚本,该脚本首先运行git describe --dirty
命令,但如果发现存储库处于脏状态,则在再次尝试并获取第二个结果之前运行git update-index -q --refresh
命令。
当迭代数百个存储库时,使用git describe-dirty
并仅为最初指示其处于脏状态的存储库运行索引更新,可节省大量时间,而不是每次运行git update-index -q --refresh ; git describe --dirty
。