使用 JGit 获取标签消息



我需要每次提交,以获取关联标签的名称和消息。

我设法获得了与我的提交关联的标签名称。但我无法收到消息。我试过这样:

String nameTag = "";
List<Ref> call = new Git(git.getRepository()).tagList().call(); // get all tags from repository
for (Ref ref: call) {
    if ((ref.getObjectId().getName()).equals(commit.getName())) {
        Map<ObjectId, String> names = git.nameRev().add(ref.getObjectId()).addPrefix("refs/tags/").call();
        nameTag = names.get(ref.getObjectId());
        System.out.println("Commit " + commit.getName() + "has tag" + nameTag);
    }
}

我尝试为每个找到的引用创建RevTag:

AnyObjectId obj = ref.getObjectId();
if(obj instanceof RevTag) {
    RevTag tag = walk.parseTag(obj);
    System.out.println(tag.getFullMessage()); 
}

但返回的对象 ID 从来都不是 RevTag。异常消息为:

Object ... is not a tag . 

如何创建解析引用的 RevTag?

您不一定必须使用 RevWalk#parseTag() 解析标签。此方法仅用于解析带注释的标记。

要区分一个和另一个,您甚至可以使用parseTag(或者有更好的方法吗?

RevTag tag;
try {
  tag = revWalk.parseTag(ref.getObjectId());
  // ref points to an annotated tag
} catch(IncorrectObjectTypeException notAnAnnotatedTag) {
  // ref is a lightweight (aka unannotated) tag
}

带注释的标记指向提交对象,因此具有作者、日期、消息等,提交对象又指向标记的提交。

轻量级标记直接引用标记的提交(很像分支,但只读),因此不能有消息。

有关注释标签与轻量级标签的更多信息:

  • 为什么我应该关心轻量级标签与带注释的标签?
  • 带注释和未注释的标记有什么区别?
// Create list with all tags from repository(annotated or lightweight):
     LogCommand log = git.log();
     List<Ref> call call = git.tagList().call();
     RevWalk walk = new RevWalk(git.getRepository());
     List<Ref> getTags = new ArrayList<Ref>();
        for (Ref ref: call)
        {
            Ref peeledRef = git.getRepository().peel(ref);
            if (peeledRef.getPeeledObjectId() != null)
            {
                log.add(peeledRef.getPeeledObjectId());
                getTags.add(peeledRef);
            }
            else
            {
                log.add(ref.getObjectId());
                getTags.add(ref);
            }
        }
//for each ref from getTags list, create a RevTag
      for (Ref obj: getTags)
        {
            String tagId = obj.getPeeledObjectId().getName();
       //use this equals if you want to get forr your commit its assciated tag 
            if (tagId.equals(your_commit.getName()))
            {
                RevTag tag = walk.parseTag(obj.getObjectId());
                System.out.println("Commit " + your_commit.getName() + " has tag " + tag.getTagName() + " with message tag " + tag.getFullMessage());
            }
        }

要从标签获取消息,我使用此代码:-

    private static void ReadTagFromName(Repository repository, String tagName) throws IOException {
        try (RevWalk walk = new RevWalk(repository)) {
            Ref annotatedTag = repository.findRef(tagName);
            RevObject any = walk.parseAny(annotatedTag.getObjectId());
            String message;
            while (any != null) {
                if (any instanceof RevCommit) {
                    RevCommit rc = (RevCommit) any;
                    message = rc.getFullMessage();
                    System.out.println(String.format("[%s][%s]", tagName, message.substring(0, message.length() - 1)));
                } else if (any instanceof RevTag) {
                    RevTag tagObject = (RevTag) any;
                    message = tagObject.getFullMessage();
                    System.out.println(String.format("[%s][%s]", tagName, message.substring(0, message.length() - 1)));
                }
                any = walk.next();
            }
            walk.dispose();
        }
    }

最新更新