我正面临同样的问题,并找不到方法让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
谢谢你的建议和备案的增强请求。你的方法看起来应该起作用,但由于某种原因,它没有检测到任何冲突。我正在尝试应用的隐藏更改没有上演,因此这不应涉及我的案例中的索引。但是,您的答案有一个方面我不明白。为什么有必要调用stashCommit.getParent(0)?这个调用不会返回与stashCommit标识相同的提交吗? – Epicurus
我从'StashApplyCommand'中取出'getParent(0)''detour',相信它引用了存储文件的提交。但再读一遍,我可能在这里错了(虽然我想知道为什么我的测试通过...)。但是,重新阅读JGit代码和[这篇文章](http://stackoverflow.com/questions/27012878/why-is-a-stash-represented-as-2-commits),你可能会成功使用'stashCommit '而不是'stashCommit.getParent(0)'。家长1似乎指向储藏室的创建来源。 HEAD也可以与自己合并。 –
如果您可以共享一个独立的测试用例,并且无法正常运行冲突检测,那将有助于追踪出现问题的地方。 –