Java 如何确定最后一次使用JGit更改文件的人
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。我还没有使用合并提交或具有多个父级的其他提交测试
现在我想知道上次谁更改了文件。迭代所有行以查找最后更改的行看起来有点不太优雅。想法?您可以将
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
搞混了。谢谢你的反馈。