簡體   English   中英

如何使用 JGit API 從父提交中獲取樹?

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

對於給定的提交,我想獲取父提交樹,以便我可以繼續比較更改。 我發現父 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");
    }

我會以錯誤的方式解決這個問題嗎? 父對象是淺拷貝,我必須做一些事情來填充樹屬性嗎?

我確實讓它按如下方式工作,但仍然想知道這是否是正確的方法。

    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()返回不完整的RevCommit s。 雖然設置了它們的 ID 屬性,但所有其他屬性(樹、消息、作者、提交者等)都沒有設置。 因此NullPointerException 為了實際使用父提交,您需要首先解析提交標頭,或者像您一樣使用parseCommit

parentCommit = revWalk.parseCommit(parentCommit.getId());

或使用parseHeaders

revWalk.parseHeaders(parentCommit);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM