我希望找出提交时间与标记提交时间之间的时间差异。
这是我到目前为止所用的,但是我认为这是正确字段的committerdate是null。
git for-each-ref --format='%(taggerdate) : %(committerdate) : %(refname)' --sort=-taggerdate --count=10 refs/tags
猜测我只关注标签,但我无法做到正确。在一个理想的世界中,它会显示时间之间的差异,但是如果不可能的话,我可以做到这一点。
答案 0 :(得分:3)
The git for-each-ref
documentation有点误导:
对于提交和标记对象,特殊
creatordate
和creator
字段将对应于committer
或tagger
字段中的相应日期或名称 - 电子邮件 - 日期元组取决于对象类型。这些用于处理带注释和轻量级标签的混合。
这与记录完全一致:%(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对象。)