当我有一个包含轻量级和带注释标记的存储库时,git-for-each-ref
似乎只对其中一个集合进行排序。我想修改我对for-each-ref
的调用以获取输出,该输出对所有标记进行排序并将它们混合在输出中。
例如:
bash-3.2$ git tag | > xargs -I T git log -n 1 --format='%at T' T | > sort -rn | > awk '{print $2}' lwt3 at3 lwt2 at2 lwt1 at1 bash-3.2$ git for-each-ref --sort=-authordate refs/tags | awk '{print $3}' refs/tags/lwt3 refs/tags/lwt2 refs/tags/lwt1 refs/tags/at1 refs/tags/at2 refs/tags/at3 bash-3.2$ git --version git version 1.6.6.80.g2df32
使用-committerdate
或-taggerdate
生成类似的输出,并且标签永远不会正确排序。使用-*authordate
或-*committerdate
时,排序的组会被反转,而-*taggerdate
则不会排序。
还有其他一些我不知道的选择吗?这是正确的行为吗?我可以看到为什么committerdate或taggerdate只会分别对提交或标签进行排序,但似乎authordate应该做我想要的。
答案 0 :(得分:3)
好的,继续并验证我在评论中所说的内容:
只有带注释的标签会在存储库中创建一个tab对象,其中包含您尝试在此处排序的taggerdate字段。您的代码很可能是轻量级代码,因此不包含此类信息。
另一半,committerdate和authordate似乎在标签上正常工作 - 它们只是对标签指向的提交进行排序,因为没有关于标签本身何时创建的信息。 (当且仅当你把 - 放在前面时)他们才会改变排序。
答案 1 :(得分:3)
要根据提交日期对已注释的标签和轻量级标签进行排序,我正在使用:
git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }'
此命令将按时间顺序列出每个标记和关联的提交对象ID。