JGit - Получить все коммиты (PlotCommitList), которые повлияли на файл / путь
Привет, я пытаюсь получить все коммиты, которые включают в себя определенный каталог или файл моего хранилища.
Я попробовал следующий код:
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.
У парня была такая же проблема здесь (1-й ответ с проблемой fileA и fileB): Ссылка - Нажмите здесь
1 ответ
Вам нужно объединить PathFilter
с ANY_DIFF
фильтр:
revWalk.setTreeFilter(
AndTreeFilter.create(PathFilter.create(path), TreeFilter.ANY_DIFF));
С помощью только PathFilter я думаю, что происходит то, что все коммиты выбираются там, где существует указанное дерево (например, все коммиты, начиная с начальной фиксации этого файла).
Также смотрите документацию по API setTreeFilter или как это делает LogCommand.