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.

Другие вопросы по тегам