我如何使用 JGit API 从父提交中获取树?

How do I get the tree from parent commits using the JGit API?

对于给定的提交,我想获取父提交树,以便我可以继续比较更改。我发现父 RevCommit 对象上的 getTree() 总是 returns null.

    ObjectId lastCommitId = repository.resolve(Constants.HEAD);

    RevWalk revWalk = new RevWalk(repository);
    RevCommit commit = revWalk.parseCommit(lastCommitId);

    List<RevCommit> parents = new ArrayList<>();
    for(RevCommit parent : commit.getParents()) {
        parents.add(parent);
    }

    if ( parents.get(0).getTree() == null ) {
        System.out.println("first parent tree was null");
    }

我是不是走错了路?父对象是浅拷贝吗,我必须做一些事情来填充树 属性?

我确实让它按如下方式工作,但仍然想知道这是否是正确的方法。

    ObjectId lastCommitId = repository.resolve(Constants.HEAD);

    RevWalk revWalk = new RevWalk(repository);
    RevCommit commit = revWalk.parseCommit(lastCommitId);

    List<RevCommit> parents = new ArrayList<>();
    for(RevCommit parent : commit.getParents()) {

        RevCommit deepCopy = revWalk.parseCommit(parent.getId());

        parents.add(deepCopy);

    }

    if ( parents.get(0).getTree() != null ) {
        System.out.println(parents.get(0).getTree().toString());
    } else {
        System.out.println("first parent tree was null");
    }

你的第二种做法是对的。 commit.getParents() returns 不完整 RevCommits。虽然设置了它们的 ID 属性,但所有其他属性(树、消息、作者、提交者等)都没有。因此 NullPointerException。为了实际使用 parent 提交,您需要首先解析提交 header,或者像

一样使用 parseCommit
parentCommit = revWalk.parseCommit(parentCommit.getId());

parseHeaders

revWalk.parseHeaders(parentCommit);