如何在JGit中强制合并(带有冲突标记)?

时间:2018-07-02 20:16:47

标签: merge jgit

在与JGit进行获取/合并时,我们的应用程序需要使用不同的合并策略。例如,对于任何冲突的JSON文件,我们要还原所有本地更改并获取THEIRS。如果它们不是JSON文件,我们希望保留本地更改并合并,甚至在存在冲突时保留冲突标记。但是,无论我如何设置合并策略,即使正常的命令行git都会完成合并,我也会得到一个CheckoutConflictException(将停止合并)。我在做什么错了?

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 :(得分:0)

我能够使用stashCreate()和stashApply()获得我想要的行为。具体而言,stashCreate()可以存储还原任何JSON文件后剩下的所有更改,然后使用PullCommand(而不是MergeCommand)提取任何新更改,然后使用stashApply()应用所有已隐藏的本地更改。我进行了测试,没有冲突,JSON文件中的冲突,在本地和远程之间更改了文件不同部分的其他文件以及更改了相同行的其他文件中的冲突。在以上所有情况下都有效。