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

List all tags in current branch with JGit

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

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

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

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

  • 需要检查每个标签是否可以从分支的尖端到达,
  • 或者对于分支上的每个提交检查它是否是一个标签。

我对 jGit 的经验不多。但理论上你可以从你的 resp 执行 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)

希望对您有所帮助。

也许有更好的方法:但这是我唯一知道的方法。

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

例如:

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 returns 从当前分支的头提交开始的迭代器。在循环中调用的 NameRecCommand 查找指向给定提交的所有标记。

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