Использование JGit fetch () и проверка обновленных файлов - PullRequest
0 голосов
/ 03 марта 2019

Используя JGit, я проверил ветку (branch1).Через некоторое время я хочу извлечь () и посмотреть, какие файлы были обновлены (в исходном) с момента моей последней выборки.

FetchResult fetchResult = m_git.fetch().setRefSpecs(new RefSpec("refs/heads/branch1")).call();

// For example:
fetchResult.getUpdatedFiles()

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я нашел то, что сработало для меня.

Получил большую часть этого из поваренной книги jgit: https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/ShowFileDiff.java#start-of-content

Коллекция DiffEntry ниже показывает мне измененные файлы.(Кстати, это можно сделать до слияния)

fetch();

// todo: isn't there a critical section here? Only within the same repo maybe. We could prevent simultaneous use of the same racfid.
Ref fetchHead;
try {
    fetchHead = m_git.getRepository().findRef("FETCH_HEAD");

    //todo: show the diff bewteen fetch-head and the current head.
    // - get object id of fetch
    // - get oid of head

    ObjectId head = m_git.getRepository().resolve(Constants.HEAD);

    AbstractTreeIterator oldTreeParser = prepareTreeParser(m_git.getRepository(), fetchHead.getObjectId());
    AbstractTreeIterator newTreeParser = prepareTreeParser(m_git.getRepository(), head);

    List<DiffEntry> diff = m_git.diff().
        setOldTree(oldTreeParser).
        setNewTree(newTreeParser).
        // setPathFilter(PathFilter.create("README.md")).
        // to filter on Suffix use the following instead
        //setPathFilter(PathSuffixFilter.create(".java")).
        call();

    for (DiffEntry entry : diff) {
        System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
    }

}

private static AbstractTreeIterator prepareTreeParser(Repository repository, ObjectId objectId) throws IOException {
    // from the commit we can build the tree which allows us to construct the TreeParser
    //noinspection Duplicates
    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(objectId);
        RevTree tree = walk.parseTree(commit.getTree().getId());
        CanonicalTreeParser treeParser = new CanonicalTreeParser();
        try (ObjectReader reader = repository.newObjectReader()) {
            treeParser.reset(reader, tree.getId());
        }
        walk.dispose();
        return treeParser;
    }
}
0 голосов
/ 03 марта 2019

Уровень детализации API выборки - это коммиты, а не файлы.Следовательно, сама выборка не скажет вам, какие файлы были обновлены.

Однако FetchResult содержит подробную информацию о результате операции выборки.

Выполните итерацию по FetchResult::getTrackingRefUpdates, чтобы увидеть все ссылкикоторые были обновлены (должен быть только один в вашем примере).Для каждого измененного ссылки, которая вас интересует, TrackingRefUpdate описывает результат операции выборки соответствующей ссылки.

Сначала посмотрите на свойство result, чтобы увидеть, является ли общий результат тем, о чем вы просили,Для регулярного обновления ссылок используйте getOldObjectId и getNewObjectId для сравнения старого и нового коммита.

Смотрите здесь, как использовать diff с JGit: Как показать изменения между коммитами с JGit

...