Jgit: как показать измененные файлы в коммите слияния
Я хотел бы использовать jgit, чтобы получить список файлов, которые были изменены в коммите слияния, аналогично тому, что git show --name-only
делает в мерзавце
Существует множество примеров того, как получить измененные файлы для обычных коммитов с одним родителем, но они не работают для коммитов слияния с несколькими родителями.
1 ответ
Насколько я понимаю, вам просто нужно объединить различия между родителями коммитта слияния с их родителями.
Фрагмент ниже создает два коммита с каждым добавленным файлом (main.txt
а также side.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();
}
Обратите внимание, что код слепо предполагает, что родители коммитов слияния сами не сливаются.