使用JGit列出当前分支中的所有标签

4

如何使用JGit列出当前分支中的所有标签?
我可以轻松地列出所有标签。

List<Ref> call = jGit.tagList().call();
for (Ref ref : call) {
    System.out.println("Tag: " + ref);
}

但是我该如何列出只在当前分支中的那些?

1
当你说“分支中的标签”时,你到底是什么意思?标签与分支没有直接关系。它们是独立的对象,指向提交节点。 - Peter Paul Kiefer
1
@PeterPaulKiefer 假设我现在在"A"分支上。我想按时间顺序列出所有位于此分支提交中的标签。 - sydd
3个回答

6

要列出给定分支的所有标签,您需要逐个提交地遍历历史记录,从分支的头提交开始。对于历史记录中的每个提交,您还需要找到指向此提交的所有标签。

例如:

git.commit().setMessage("tagged").call();
git.tag().setName("mytag").call();
git.commit().setMessage("untagged").call();

Iterable<RevCommit> commits = git.log().call();
for (RevCommit commit : commits) {
  Map<ObjectId, String> namedCommits = git.nameRev().addPrefix("refs/tags/").add(commit).call();
  if (namedCommits.containsKey(commit.getId())) {
    System.out.println("tag " + namedCommits.get(commit.getId()) + " -> " + commit);
  }
}

输出结果将会像这样。
tag mytag -> commit 92a85dcb2326caf08f4ad1ddb6132f92ee0b3e7c 1438794838 ----sp

在这里,提交是 taggsd 标签。

LogCommand 返回一个迭代器,其起点是当前分支的头提交。循环中调用的NameRecCommand 会找到指向给定提交的所有标签。

一种优化的变体可以使用 ListTagCommand 一次检索所有标记的列表,然后将 git.nameRev 代码替换为查找标记列表中当前提交的代码。


不幸的是,这段代码只能找到每个提交的第一个标签,要找到所有标签,您需要使用 List <RevTag> list = git.tagList()。call(); 并将它们的对象引用与您感兴趣的提交的sha1进行比较。 - mikee

0

Git中的标签不附加到分支。标签是全局对象,仅附加到提交。也就是说,您需要:

  • 检查每个标签是否可从分支的末尾到达
  • 或者对于分支上的每个提交,检查它是否是一个标签。

0

我对jGit没有太多的经验。但理论上,您可以从您的分支执行git log --decorate=full。这应该可以使用jGit中的Porcelain API实现。这将列出从分支顶部到根(初始提交)的提交。在已标记提交的日志文本中,您可以找到一个(tag: refs/tags/<tagname>)条目,您可以使用正则表达式解析它。

这里是在我的命令行上运行的示例。

$ git log  --decorate=full  |grep tag:
commit 1b1fac8c013c2e9fd629bb9f6387a0fc297190e3 (tag: refs/tags/ppk2)
commit f02f361bbffb838f7499ed63f0a9c0ae5565ff01 (tag: refs/tags/ppk1)
commit 24baea8bae11019941da86c79c612cedfa17a69f (tag: refs/tags/ppk4, tag: refs/tags/ppk3)

希望这有所帮助。
也许还有更好的方法,但这是我知道的唯一方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接