为什么git-for-each-ref无法正确排序标签?

时间:2010-01-07 15:55:32

标签: git sorting

当我有一个包含轻量级和带注释标记的存储库时,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应该做我想要的。

2 个答案:

答案 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。