Java 如何确定最后一次使用JGit更改文件的人

Java 如何确定最后一次使用JGit更改文件的人,java,jgit,Java,Jgit,JGit描述了如何责怪文件中特定行的作者 现在我想知道上次谁更改了文件。迭代所有行以查找最后更改的行看起来有点不太优雅。想法?您可以将LogCommand与如下路径过滤器一起使用: Iterable Iterable=git.log().addPath(“foo.txt”).call(); RevCommit latestCommit=iterable.iterator().next(); 代码查找修改的foo.txt的latestCommit。我还没有使用合并提交或具有多个父级的其他提交测试

JGit描述了如何责怪文件中特定行的作者


现在我想知道上次谁更改了文件。迭代所有行以查找最后更改的行看起来有点不太优雅。想法?

您可以将
LogCommand
与如下路径过滤器一起使用:

Iterable Iterable=git.log().addPath(“foo.txt”).call();
RevCommit latestCommit=iterable.iterator().next();
代码查找修改的
foo.txt
latestCommit
。我还没有使用合并提交或具有多个父级的其他提交测试上述代码段

注意但是,此解决方案可能会泄漏资源:提供迭代器的
RevWalk
LogCommand
创建,但从未关闭

为了避免资源泄漏,您可以手动迭代历史,如下所示:

RevCommit latestCommit = null;
String path = "file.txt";
try( RevWalk revWalk = new RevWalk( git.getRepository() ) ) {
  Ref headRef = git.getRepository().exactRef( Constants.HEAD );
  RevCommit headCommit = revWalk.parseCommit( headRef.getObjectId() );
  revWalk.markStart( headCommit );
  revWalk.sort( RevSort.COMMIT_TIME_DESC );
  revWalk.setTreeFilter( AndTreeFilter.create( PathFilter.create( path ), TreeFilter.ANY_DIFF ) );
  latestCommit = revWalk.next();
}

为什么像
git.log().addPath(“README.md”).call()这样的东西不起作用呢?因为
LogCommand
不提供
setPath()
方法。但是谢谢你的反对,我认为上面的代码片段可以用
TreeFilter
简化。我很快就会更新这篇文章。多亏了@centic,代码片段abive现在简单多了。嗨@Rüdigerhermann,你几乎是对的。LogComand确实有一个与“addPath”类似的“addPath”。我和LogComand有一个有效的解决方案。有点特殊的是,需要按如下所述创建Git对象:。如果你愿意,你可以描述它,而不是我会接受它,否则我写我自己。所以centics解决方案对我很有效。对不起,我把
addPath
setPath
搞混了。谢谢你的反馈。