Merge 如何在JGit中强制合并(使用冲突标记)?

Merge 如何在JGit中强制合并(使用冲突标记)?,merge,jgit,Merge,Jgit,我们的应用程序在获取/合并JGit时需要使用不同的合并策略。例如,对于任何存在冲突的JSON文件,我们希望还原任何本地更改并获取它们的更改。如果它们不是JSON文件,我们希望保留本地更改和合并,甚至在存在冲突时保留冲突标记。然而,无论我如何设置合并策略,我都会得到一个CheckoutConflictException(它会停止合并),即使正常的命令行git会完成合并。我做错了什么 public String update() throws Exception { // We fetch

我们的应用程序在获取/合并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();
}
public String update()引发异常{
//我们手动获取并进行一次干运行合并,以捕获任何冲突,这样我们就可以重置它们
fetch();
Ref fetchHead=this.repo().getRepository().findRef(“FETCH_HEAD”);
试一试{
MergeResult MergeResult=this.repo().merge()
.setStrategy(MergeStrategy.RECURSIVE)
.setCommit(false)
.setFastForward(MergeCommand.FastForwardMode.FF)
.包括(取头)
.call();
}捕获(CheckoutConflictException cce){
列表冲突=cce.getConflictingPath();
if(conflicts!=null&&conflicts.size()>0){
for(字符串文件:冲突){
if(file.endsWith(“.json”)){
还原(path.get(file));
}
}
}
}
///…现在我们已经恢复了所有冲突的JSON文件,我们可以尝试真正的合并
MergeResult MergeResult=this.repo().merge()
.setStrategy(MergeStrategy.RECURSIVE)
.setCommit(true)
.setFastForward(MergeCommand.FastForwardMode.FF)
.包括(取头)
.call();
返回mergesult.getMergeStatus().toString();
}

我能够使用stashCreate()和stashApply()获得我想要的行为。具体来说,stashCreate()用于隐藏还原任何JSON文件后留下的任何更改,然后使用PullCommand(而不是MergeCommand)提取任何新更改,然后使用stashappy()应用任何隐藏的本地更改。我对它进行了测试,没有冲突,JSON文件中有冲突,本地和远程文件中的不同部分发生了更改,其他文件中的冲突,以及同一行发生了更改。它在上述所有情况下都有效