JGit 如何获取 DiffEntry 的 RevCommit 列表

JGit How get list of RevCommit for DiffEntry

我使用 JGit 得到两个分支之间的区别如下:

ObjectReader reader = git.getRepository().newObjectReader();

CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();

Ref master = git.getRepository().exactRef(getRefBranchName( branchMaster) );
RevTree masterTree = new RevWalk(git.getRepository()).parseTree(master.getObjectId());
    oldTreeIter.reset(reader, masterTree.getId());

Ref release = git.getRepository().exactRef(getRefBranchName( branchRelease));
RevTree releaseTree = new RevWalk(git.getRepository()).parseTree(release.getObjectId());
    newTreeIter.reset(reader, releaseTree.getId());

List<DiffEntry> diffs = git.diff().setNewTree(newTreeIter).setOldTree(oldTreeIter).call();

然后我可以打印文件中的差异如下:

ByteArrayOutputStream outputStream =  new ByteArrayOutputStream();
DiffFormatter formatter = new DiffFormatter (outputStream);
formatter.setRepository(git.getRepository());
for (DiffEntry entry: diffs){               
    System.out.println("Diff Entry: " + entry + ", from: " + entry.getOldId()+", to: " + entry.getNewId());
    formatter.format(entry);
    String diffText = outputStream.toString("UTF-8");
    System.out.println(diffText);
    outputStream.reset();
}               

我看到了这个分支中两个文件之间的所有差异,但是我如何才能获得针对某些 DiffEntry 的差异的所有提交?我还没找到办法

一个DiffEntry没有'a list of RevCommits'。它表示对文件的单个更改,并描述是否添加、修改或删除了文件。提交不一定是更改的来源。

但是,您已经有了指向从中计算 DiffEntries 的提交的指针。是 masterrelease

使用ref.getObjectId()你可以获得ref当前指向的提交的id。

要获得包含提交的所有元数据并指向其 RevCommit,您需要像这样使用 RevWalk

try( RevWalk walk = new RevWalk( repository ) ) {
  RevCommit commit = walk.parseCommit( master.getObjectId() );
}    

有关 JGit 差异的更多信息 API 您可能需要阅读这篇文章 What’s the Difference? Creating Diffs with JGit