[英]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.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
调用的NameRecCommand
查找指向给定提交的所有标签。
优化的变体可以使用ListTagCommand
一次检索所有标签的列表,然后用在标签列表中查找当前提交的代码替换git.nameRev
代码。
Git 中的标签不附加到分支。 标签是仅附加到提交的全局对象。 也就是说,你要么
我对 jGit 没有太多经验。 但理论上你可以从你的git log --decorate=full
执行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)
希望有帮助。
也许有更好的方法:但这是我唯一知道的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.