为什么来自 Git.tagList().call() 的对象不是标签?

Why object from Git.tagList().call() is not a tag?


我正在尝试 Jgit,我想检索克隆存储库的所有标签,我想按日期对它们进行排序。这就是为什么我要尝试以下操作:
String path = "path/to/my/git/repo/.git";
Repository repository = builder.setGitDir(new File(path)).readEnvironment().findGitDir().build();
try (RevWalk walk = new RevWalk(repository)) {
            List<Ref> taglist = new Git(repository).tagList().call();

            Collections.sort(taglist, new Comparator<Ref>() {
                public int compare(Ref o1, Ref o2) {
                    Date d1 = null;
                    Date d2 = null;
                    try {
                        d1 = walk.parseTag(o1.getObjectId()).getTaggerIdent().getWhen();
                        d2 = walk.parseTag(o2.getObjectId()).getTaggerIdent().getWhen();
                    } catch (IOException e) {
                        e.printStackTrace(); 
                    }
                    return d1.compareTo(d2);
                }
            });
        }catch (GitAPIException e){
            e.printStackTrace();
        }
    }

问题是 this.taglist = new Git(repository).tagList().call() 返回的一些 Ref 不是标签:实际上 parseTag() 引发了一个异常,它的消息是: org.eclipse.jgit.errors.IncorrectObjectTypeException: Object 3ea2b388b5ef02622312fe08e6935a5f9c655e00 is not a tag.

谁能解释一下为什么会这样,我该如何解决这个问题?
谢谢大家

JGit 的 Git.tagList() returns 一个 org.eclipse.jgit.api.ListTagCommand.

ListTagCommand.call() returns 输入 List<Ref> as documented.

Ref interfaceObjectIdRefObjectIdRef.PeeledNonTagObjectIdRef.PeeledTagObjectIdRef.UnpeeledSymbolicRef实现。

您应该在尝试对其进行任何操作之前检查返回值的类型,或者像您所做的那样使用 try/catch。

正如我在评论中所说,我解决了将 walk.parseTag(o1.getObjectId()).getTaggerIdent().getWhen(); 更改为 walk.parseCommit(o1.getObjectId()).getAuthorIdent().getWhen(); 的问题,对于 o2 也是如此。 希望这会对其他人有所帮助。