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