我如何计算git标签和原始提交之间的时差

Joh*_*ohn 5 git git-tag

我想找出提交时间和标记提交时间之间的时间差.

这是我到目前为止,但我认为这是正确的字段的committerdate是null.

git for-each-ref --format='%(taggerdate) : %(committerdate) :  %(refname)' --sort=-taggerdate --count=10 refs/tags
Run Code Online (Sandbox Code Playgroud)

我猜我只看标签,但我无法做到.在一个理想的世界中,它会显示时间之间的差异,但如果不可能,我可以在之后做到这一点.

tor*_*rek 3

git for-each-ref文档有点误导:

对于提交和标记对象,特殊creatordatecreator字段将对应于committertagger字段中的适当日期或名称-电子邮件-日期元组,具体取决于对象类型。这些旨在用于处理带注释和轻量级标签的混合。

这确实按照记录的方式工作:%(creatordate)从这些带注释的标签的字段中获取日期tagger。然而,这似乎意味着对于带注释的标签,Git 可能会检查相应的提交:如果没有,它如何获得committer

事实上,永远不要直接for-each-ref查看带注释的标签的目标对象。该字段的提及是特定于轻量级标签的,它指向提交,1而不是带注释的标签对象。幸运的是,有一个格式指令可以说“间接查看”:只需在指令前面加上. 2committer*

因此答案是:

git for-each-ref \
    --format='%(taggerdate) : %(*committerdate) :  %(refname)' \
    --sort=-taggerdate --count=10 refs/tags
Run Code Online (Sandbox Code Playgroud)

1轻量级标签可以直接指向树或blob;目前尚不清楚此案中会发生什么。扩展可能是空的。

2请注意,这仅间接一次,因此如果带注释的标记的目标是另一个标记(或者是树或 blob),则不会有提交者日期字段。为了真正使其可靠,您可能应该使用一些 shell 脚本并使用^{}^{commit}后缀解析标签名称。(这两者之间的区别在于,如果最终目标对象是树或 blob,则会失败,而^{commit}找到^{}树或 blob 对象则会成功。)