【问题标题】:Distinguish between lightweight and annotated tags in JGit区分 JGit 中的轻量级标签和带注释的标签
【发布时间】:2020-09-16 10:39:15
【问题描述】:

我试图弄清楚如何区分 JGit 中的轻量级标签和带注释的标签而不捕获任何异常。在我的特殊情况下,我需要这种区别来获取给定提交的所有标签名称。


public List<String> getTagNamesOfCommit(String commitHash) throws Exception {
  List<String> tagNames = new ArrayList<>();
  RevWalk walk = new RevWalk(repository);
  List<Ref> tagList = git.tagList().call();
  for (Ref tag : tagList) {
    ObjectId peeledObjectId = tag.getPeeledObjectId();
    try {
      // Try to get annotated tag
      RevTag refetchedTag = walk.parseTag(tag.getObjectId());
      RevObject peeled = walk.peel(refetchedTag.getObject());
      if (peeled.getId().getName().equals(commitHash)) {
        tagNames.add(Repository.shortenRefName(tag.getName()));
      }
    } catch(IncorrectObjectTypeException notAnAnnotatedTag) {
      // Tag is not annotated. Yes, that's how you find out ...
      if (tag.getObjectId().getName().equals(commitHash)) {
        tagNames.add(Repository.shortenRefName(tag.getName()));
      }
    }
  }
  walk.close();
  return tagNames;
}

这是question的答案中包含的等效解决方案

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

org.eclipse.jgit.lib.Ref 类有 getPeeledObjectId() 方法,如果是带注释的标签,它应该返回提交的 id。

* return if this ref is an annotated tag the id of the commit (or tree or
*        blob) that the annotated tag refers to; {@code null} if this ref
*        does not refer to an annotated tag.

这样我可以检查 null,这比捕获异常要好得多。不幸的是,该方法在每种情况下都返回null

两个问题:

  1. git.tagList().call()的使用有什么问题吗?
  2. 确定标签是否为带注释的正确方法是什么?

【问题讨论】:

    标签: jgit


    【解决方案1】:

    如果您在jgit-cookbook 中运行示例ReadTagForName,则输出包含以下内容:

    Commit: (class org.eclipse.jgit.revwalk.RevCommit)commit a3033aec313556ba4e1ef55a66167a35432a4bc1 1369660983 ------p
    Tag: (class org.eclipse.jgit.revwalk.RevTag)tag 25f629b5e8ddfabd55650c05ffbb5199633b6df0 ------p
    

    所以您应该能够检查返回的Ref 对象的实际类。如果是“RevCommit”就是轻量级标签,如果是“RevTag”就好像是带注释的标签。

    【讨论】:

    • 非常感谢您的回答。类区别看起来比异常处理更好。他们实现了 Ref 类有点令人困惑,该类包含标签名称,然后您必须再次解析该对象以获取一个 RevObject ,然后可以在其上进行区分。我想念一个真正的 Tag 对象,它包含所有内容(isAnnotated、名称、提交引用等)。无论如何,您的回答似乎是解决我问题的最佳方法。
    猜你喜欢
    • 2011-06-27
    • 2017-03-21
    • 1970-01-01
    • 2020-10-10
    • 2021-07-17
    • 2019-01-12
    • 1970-01-01
    • 2011-01-18
    • 2021-07-10
    相关资源
    最近更新 更多