使用JGit列出提交之间更改的文件清单

4

我想获取两个提交(commit)之间更改(添加、修改或删除)的文件路径。

从命令行中,只需输入以下命令:

git diff --name-only abc123..def456

使用JGit有什么等效的方法来实现这个功能?
1个回答

10

您可以使用DiffFormatter来获取DiffEntry列表。每个条目都有一个changeType,指定文件是添加、删除还是更改的。条目的getOldPath()getNewPath()方法返回路径名。JavaDoc列出了每种更改类型的每个方法返回的内容。

ObjectReader reader = git.getRepository().newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
ObjectId oldTree = git.getRepository().resolve( "HEAD~1^{tree}" );
oldTreeIter.reset( reader, oldTree );
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
ObjectId newTree = git.getRepository().resolve( "HEAD^{tree}" );
newTreeIter.reset( reader, newTree );

DiffFormatter diffFormatter = new DiffFormatter( DisabledOutputStream.INSTANCE );
diffFormatter.setRepository( git.getRepository() );
List<DiffEntry> entries = diffFormatter.scan( oldTreeIter, newTreeIter );

for( DiffEntry entry : entries ) {
  System.out.println( entry.getChangeType() );
}

上述示例列出了 HEAD 与其前一版本之间的更改文件,但可以更改为比较任意提交,如 abc^{tree}


只是一个问题 - 为什么旧树在“新的”修订版下?如果实际上是新的,那它为什么是旧的?HEAD^{tree} 表示当前 head 提交(树),而 HEAD~1^{tree} 是当前 head 的父提交 - 因此它落后于 1 次提交。 - Antoniossss
你是对的,oldTreenewTree应该被更改。我已经相应地编辑了这篇文章。 - Rüdiger Herrmann
好的,知道是个错误了,谢谢你提供的代码片段。我刚刚使用了它。 - Antoniossss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接