我正在尝试获取包含我的存储库的特定目录或文件的所有提交。
我尝试了下面的代码:
public PlotCommitList getPlotCommits(String path){
System.out.println(path);
PlotCommitList<PlotLane> plotCommitList = new PlotCommitList<PlotLane>();
PlotWalk revWalk = new PlotWalk(repository);
try {
ObjectId rootId = repository.resolve("HEAD");
if (rootId != null) {
RevCommit root = revWalk.parseCommit(rootId);
revWalk.markStart(root);
revWalk.setTreeFilter(PathFilter.create(path));
plotCommitList.source(revWalk);
plotCommitList.fillTo(Integer.MAX_VALUE);
return plotCommitList;
}
} catch (AmbiguousObjectException ex) {
Logger.getLogger(GitRepository.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(GitRepository.class.getName()).log(Level.SEVERE, null, ex);
}
return plotCommitList;
}
我没有得到影响该文件的提交。我得到了整个列表的一些“子列表”,但不仅仅是那些影响该文件的提交。
也许TreeFilter不按我的想法工作?我应该用其他方式来获取这些提交? 我看到log命令有一个路径过滤器,但我还没有尝试过,因为它返回一个RevCommit列表,而对于我的PlotCommitList,我需要一个revwalk来用作源。而且我认为我无法将RevCommit投射到PlotCommit。
一个人在这里遇到了同样的问题(第一个答案是fileA和fileB问题):Link - Click Here
答案 0 :(得分:3)
您需要将PathFilter
与ANY_DIFF
过滤器结合使用:
revWalk.setTreeFilter(
AndTreeFilter.create(PathFilter.create(path), TreeFilter.ANY_DIFF));
只有PathFilter我认为发生的事情是在指定的树存在的地方选择所有提交(例如,从该文件的初始提交开始的所有提交)。
另请参阅API docs of setTreeFilter或LogCommand如何做到这一点。