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

问题描述 投票:5回答:1

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

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

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

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

git git-tag
1个回答
3
投票

The git for-each-ref documentation有点误导:

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

这确实与记录完全一样:%(creatordate)从这些带注释标签的tagger字段中获取日期。但是,它似乎意味着对于带注释的标签,Git可能会检查相应的提交:如果没有,它将如何获得committer

事实上,for-each-ref从不直接看注释标签的目标对象。提到committer字段特定于轻量级标记,它指向提交,1而不是带注释的标记对象。幸运的是,有一个格式指令说“间接地看”,因为它是:只需在命令前加上*.2。

因此答案是:

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

1轻量级标签可以直接指向树木或斑点;目前还不清楚在这种情况下会发生什么。可能扩张是空的。

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

© www.soinside.com 2019 - 2024. All rights reserved.