为什么在描述干净的签出时,`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