我想找出提交时间和标记提交时间之间的时间差.
这是我到目前为止,但我认为这是正确的字段的committerdate是null.
git for-each-ref --format='%(taggerdate) : %(committerdate) : %(refname)' --sort=-taggerdate --count=10 refs/tags
Run Code Online (Sandbox Code Playgroud)
我猜我只看标签,但我无法做到.在一个理想的世界中,它会显示时间之间的差异,但如果不可能,我可以在之后做到这一点.
该git for-each-ref文档有点误导:
对于提交和标记对象,特殊
creatordate和creator字段将对应于committer或tagger字段中的适当日期或名称-电子邮件-日期元组,具体取决于对象类型。这些旨在用于处理带注释和轻量级标签的混合。
这确实按照记录的方式工作:%(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 对象则会成功。)