Jgit:如何在合并提交中显示更改的文件



我想使用jgit来获取在合并提交中更改的文件列表,类似于git show --name-only在git中所做的操作。

有很多关于如何为具有一个父级的正常提交获取更改文件的示例,但它们不适用于具有多个父级合并提交。

根据我的理解,您只需要将合并提交的父级的diff与其各自的父级相结合。

下面的代码段创建了两个提交,每个提交都添加了一个文件(main.txtside.txt),然后合并提交与上面的不同

public void diffMerge() throws Exception {
  RevCommit baseCommit = commitChanges();
  Ref sideBranch = git.branchCreate().setName( "side" ).call();
  File mainFile = new File( git.getRepository().getWorkTree(), "main.txt" );
  mainFile.createNewFile();
  RevCommit mainCommit = commitChanges();
  git.checkout().setName( sideBranch.getName() ).call();
  File sideFile = new File( git.getRepository().getWorkTree(), "side.txt" );
  sideFile.createNewFile();
  RevCommit sideCommit = commitChanges();
  git.checkout().setName( "refs/heads/master" ).call();
  ObjectId mergeCommitId = git.merge().include( sideCommit ).call().getNewHead();
  DiffFormatter diffFormatter = new DiffFormatter( NullOutputStream.INSTANCE );
  diffFormatter.setRepository( git.getRepository() );
  RevCommit mergeCommit = parseCommit( mergeCommitId );
  List<DiffEntry> mainEntries = diffFormatter.scan( parseCommit( mergeCommit.getParent( 0 ) ).getParent( 0 ), mergeCommit.getParent( 0 ) );
  List<DiffEntry> sideEntries = diffFormatter.scan( parseCommit( mergeCommit.getParent( 1 ) ).getParent( 0 ), mergeCommit.getParent( 1 ) );
  diffFormatter.close();
  mainEntries.forEach( entry -> System.out.println( entry.getNewPath() ) );
  sideEntries.forEach( entry -> System.out.println( entry.getNewPath() ) );
}
private RevCommit parseCommit( ObjectId commitId ) throws IOException {
  try( RevWalk revWalk = new RevWalk( git.getRepository() ) ) {
    return revWalk.parseCommit( commitId );
  }
}
private RevCommit commitChanges() throws GitAPIException {
  git.add().addFilepattern( "." ).call();
  return git.commit().setMessage( "commit message" ).call();
}

请注意,代码盲目地假设合并提交的父级本身不是合并。

相关内容

  • 没有找到相关文章

最新更新