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

时间:2015-08-05 14:59:50

标签: java git jgit

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

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

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

3 个答案:

答案 0 :(得分:4)

为了列出给定分支的所有标记,您需要通过提交来执行历史记录提交,从分支的头部提交开始。对于历史记录中的每个提交,您需要找到指向此提交的所有标记。

例如:

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代码替换为在标记列表中查找当前提交的代码。

答案 1 :(得分:0)

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

  • 需要检查每个标记是否可以从分支的提示中找到
  • 或对分支上的每个提交检查它是否为标记。

答案 2 :(得分:0)

我&#39;没有太多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)

希望有所帮助。

也许有更好的方法:但这是我认识的唯一一个。