Как заставить слияние (с маркерами конфликта) в JGit? - PullRequest
0 голосов
/ 02 июля 2018

Наше приложение должно использовать различные стратегии слияния при извлечении / слиянии с JGit. Например, для любых конфликтующих файлов, которые являются файлами JSON, мы хотим отменить любые локальные изменения и получить их. Если они не являются файлами JSON, мы хотим сохранить локальные изменения и объединить их, даже сохраняя маркеры конфликтов при наличии конфликтов. Однако, независимо от того, как я установил стратегию слияния, я получаю исключение CheckoutConflictException (которое останавливает слияние), даже если бы слияние выполнял обычный git из командной строки. Что я делаю не так?

public String update() throws Exception {
    // We fetch manually and do a dry-run merge to catch any conflicts, so we can reset them

    fetch();
    Ref fetchHead = this.repo().getRepository().findRef("FETCH_HEAD");

    try {
        MergeResult mergeResult = this.repo().merge()
            .setStrategy(MergeStrategy.RECURSIVE)
            .setCommit(false)
            .setFastForward(MergeCommand.FastForwardMode.FF)
            .include(fetchHead)
            .call();
    } catch (CheckoutConflictException cce) {
        List<String> conflicts = cce.getConflictingPaths();

        if (conflicts != null && conflicts.size() > 0) {
            for (String file : conflicts) {
                if (file.endsWith(".json")) {
                    revert(Paths.get(file));
                }
            }
        }
    }

    /// ... and now that we've reverted any conflicted JSON files, we can try the merge for real

    MergeResult mergeResult = this.repo().merge()
        .setStrategy(MergeStrategy.RECURSIVE)
        .setCommit(true)
        .setFastForward(MergeCommand.FastForwardMode.FF)
        .include(fetchHead)
        .call();

    return mergeResult.getMergeStatus().toString();
}

1 Ответ

0 голосов
/ 03 июля 2018

Мне удалось получить желаемое поведение, используя stashCreate () и stashApply (). В частности, stashCreate () для сохранения любых изменений, оставшихся после возврата любых файлов JSON, затем с помощью PullCommand (не MergeCommand) извлекает любые новые изменения, а затем с помощью stashApply () применяет любые сохраненные локальные изменения. Я проверил это без конфликтов, конфликтов в файлах JSON, конфликтов в других файлах, где различные части файла были изменены между локальным и удаленным, и других файлов, где были изменены те же строки. Это работало во всех вышеперечисленных случаях.

...