为什么在描述干净的签出时,`git descripe-dirty`会添加一个`dirty`后缀?

为什么在描述干净的签出时,`git descripe-dirty`会添加一个`dirty`后缀?,git,git-describe,Git,Git Describe,我刚刚发现了--dirty选项来git descripe,它看起来应该做一些非常有用的事情,即当工作树是dirty时,在git descripe的输出中附加一个后缀,但是在我的一些存储库中似乎不是这样的: $ git status # On branch 8.30 nothing to commit (working directory clean) $ git describe --dirty 8.30rel-8-g9c1cbdb-dirty 我认为这可能是因为工作目录相对于标记是脏的,但情

我刚刚发现了
--dirty
选项来
git descripe
,它看起来应该做一些非常有用的事情,即当工作树是dirty时,在
git descripe
的输出中附加一个后缀,但是在我的一些存储库中似乎不是这样的:

$ 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
我过去经常广泛使用
hgid
,我喜欢它的默认行为是为脏存储库报告的任何提交哈希添加
+
后缀,因此从那时起我就一直在寻找
git
等价物,但是,
git descripe--dirty
似乎没有达到我在文档中预期的效果:

我还发现,当
git descripe
将存储库报告为
dirty
时,
gitk
也显示“本地未提交的更改,未签入索引”,然后列出工作目录中的每个文件,但与它们没有区别,只有
---filename---


进一步更新:由于这仍然是一个问题,我最终编写了一个
git descripe dirty
脚本,它首先运行
git descripe--dirty
,但是如果它发现存储库是脏的,则在重试并获取第二个结果之前运行
git update index-q--refresh


在遍历数百个存储库时,使用
git descripe dirty
并仅对一个最初表明它是脏的存储库运行索引更新,这比运行
git update index-q--refresh节省了大量时间;每次使用git descripe--dirty

如果您运行的是git 1.7.6或更早版本,则在使用
git descripe--dirty
之前需要运行
git update index--refresh
,因为索引可能已过时。使用
git diff--quiet HEAD
的变通方法很有效,因为“git diff”是一个陶瓷命令,可能会更新索引本身

for git 1.7.7描述了这个问题:

运行git descripe--dirty时,应该刷新索引。以前 当, 事实上,它只是过时了

请注意,您描述的步骤的确切顺序不应该有这个问题,因为
git status
会更新索引。但我仍然认为您看到了同样的问题,因为您描述的解决方法是匹配的。以下是我如何证明这个问题:

% git describe --tags --dirty
v1.0.0
% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git status
# On branch dev
nothing to commit (working directory clean)
% git describe --tags --dirty
v1.0.0
在这里,运行“git status”作为副作用更新索引,并修复“git descripe”输出,就像您的解决方法一样。git 1.7.6及更早版本的正确管道修复应为:

% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git update-index --refresh
% git describe --tags --dirty
v1.0.0
Git 2.13(2017年第2季度)在
--dirty
标志上做了一些改进,带有一个
--breaked
标志,因为当无法确定 工作树中的状态与头部的状态匹配(例如,断开 存储库或断开的子模块)

参见。
(于2017年3月27日被合并)

内置/描述
:引入--断开标志
git descripe
告诉您当前的版本号或错误,例如。 在存储库之外运行时,下载时可能会发生这种情况 一个tarball,而不是使用git获取源代码

要在不在存储库中时保留仅出错的属性, 严重(子模块)错误必须降级为轻微报告 而不是让git完整地描述错误

为了实现这一点,引入了一个标志“
--breaked
”,该标志位于相同的位置 静脉为“
--dirty
”,但使用实际的子进程检查脏污。 当孩子意外死亡时,我们将附加“
-breaked
”而不是
-dirty”
请注意,大约一年前,git Descripte--dirty出现了另一个bug修复:

“git--work tree=$there--git dir=$here description--dirty”无法正常工作,因为它没有注意到用户指定的工作树的位置


在这个bug的情况下,这里显示的解决方法不起作用,所以我们必须升级我们的安装。在今天(2020—02-20)看来,Debian BuST似乎没有固定的解决方案,但是Debian Bulle See主Git包现在与BuSTER兼容。

项目中是否有子模块?注意:Git 2.13(Q2 2016),您没有<代码>脏> /代码>,但也请<代码> -Buffy考虑。这是一个在问题解决之前演示的示例。请注意,
descripe
是瓷制的,并且已经按照@pertius的建议进行了修复,尽管twitter讨论的结果显然与此相反。(请参阅)有关过时索引的更多背景信息,以及中的管道级别命令为什么会出现这种情况。是的,您可以在中查看有关此方面的更多详细信息
% git describe --tags --dirty
v1.0.0
% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git status
# On branch dev
nothing to commit (working directory clean)
% git describe --tags --dirty
v1.0.0
% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git update-index --refresh
% git describe --tags --dirty
v1.0.0