2016-09-14 69 views
2

我正在使用StashApplyCommand类将隐藏的提交应用于工作树。如果发生冲突,此类的call()方法将抛出StashApplyFailureException列表隐藏在JGit中应用冲突

但是,我无法找到一种方式来检索冲突列表。与MergeCommand不同,StashApplyCommand不返回此列表作为call()方法返回值的一部分。

是否有可能检索JGit中存储引起的冲突?

回答

2

我正面临同样的问题,并找不到方法让StashApplyCommand告诉我哪些文件导致冲突。

我当前使用的解决方法是使用ResolveMerger来查看是否可以应用存储。如果存在冲突的文件,则合并可以列出它们。

例如:

ObjectId headCommitId = // id of head commit 
RevCommit stashCommit = // parsed stash (commit) to be applied 
ObjectId stashHeadCommit = stashCommit.getParent(0); 
ResolveMerger merger = (ResolveMerger)MergeStrategy.RESOLVE.newMerger(repository, true); 
merger.setWorkingTreeIterator(new FileTreeIterator(repository)); 
merger.setBase(stashHeadCommit); 
if(!merger.merge(headCommitId, stashCommit)) { 
    // look into merger.getFailingPaths() and merger.getUnmergedPaths() 
} 

注意,上面的代码片断就无法检测指标冲突,在我的环境中,指数永远会导致冲突。尽管应该可以扩展这种方法来检查冲突指数。 IIRC stashCommit.getParent(1)指向隐藏指数。

在希望的解决方法变得过时的一天,我已经提交了增强请求: https://bugs.eclipse.org/bugs/show_bug.cgi?id=501475

+0

谢谢你的建议和备案的增强请求。你的方法看起来应该起作用,但由于某种原因,它没有检测到任何冲突。我正在尝试应用的隐藏更改没有上演,因此这不应涉及我的案例中的索引。但是,您的答案有一个方面我不明白。为什么有必要调用stashCommit.getParent(0)?这个调用不会返回与stashCommit标识相同的提交吗? – Epicurus

+0

我从'StashApplyCommand'中取出'getParent(0)''detour',相信它引用了存储文件的提交。但再读一遍,我可能在这里错了(虽然我想知道为什么我的测试通过...)。但是,重新阅读JGit代码和[这篇文章](http://stackoverflow.com/questions/27012878/why-is-a-stash-represented-as-2-commits),你可能会成功使用'stashCommit '而不是'stashCommit.getParent(0)'。家长1似乎指向储藏室的创建来源。 HEAD也可以与自己合并。 –

+0

如果您可以共享一个独立的测试用例,并且无法正常运行冲突检测,那将有助于追踪出现问题的地方。 –