我想找出提交时间和标记提交时间之间的时间差。
这是我到目前为止,但我认为这是正确的字段的committerdate是null。
git for-each-ref --format='%(taggerdate) : %(committerdate) : %(refname)' --sort=-taggerdate --count=10 refs/tags
我猜我只看标签,但我无法做到。在一个理想的世界中,它会显示时间之间的差异,但如果不可能,我可以在之后做到这一点。
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对象。)