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

时间:2016-10-10 12:50:36

标签: git git-tag

我希望找出提交时间与标记提交时间之间的时间差异。

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

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

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

1 个答案:

答案 0 :(得分: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对象。)