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

Int*_*ion 5 java jgit

对于给定的提交,我想获取父提交树,以便我可以继续比较更改.我发现父RevCommit对象上的getTree()始终返回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");
    }
Run Code Online (Sandbox Code Playgroud)

我这是错误的方式吗?父对象是浅层副本吗?我必须做一些事情来填充树属性?

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

    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");
    }
Run Code Online (Sandbox Code Playgroud)

Rüd*_*ann 7

你的第二种方法是对的.commit.getParents()返回不完整的RevCommits.设置ID属性时,所有其他属性(树,消息,作者,提交者等)都不是.因此NullPointerException.为了实际使用父提交,您需要首先解析提交标头,或者parseCommit像您一样

parentCommit = revWalk.parseCommit( parentCommit.getId() );
Run Code Online (Sandbox Code Playgroud)

或者 parseHeaders

revWalk.parseHeaders( parentCommit );
Run Code Online (Sandbox Code Playgroud)