对于给定的提交,我想获取父提交树,以便继续比较更改。我发现父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");
}
答案 0 :(得分:6)
你的第二种方法是对的。 commit.getParents()
返回不完整的RevCommit
。设置ID属性时,所有其他属性(树,消息,作者,提交者等)都不是。因此NullPointerException
。为了实际使用父提交,您需要首先使用parseCommit
解析提交标头
parentCommit = revWalk.parseCommit( parentCommit.getId() );
或parseHeaders
revWalk.parseHeaders( parentCommit );