libgit2:合并冲突

libgit2: Merge with conflicts

我正在使用 libgit2 实现合并,但我无法让它处理冲突(对文件中同一行的更改)- 合并只是中止,没有任何内容写入索引或到工作区。可解决的冲突(更改为不同的行)工作正常。

它以 GIT_ECONFLICT 退出,这显然表明工作树 and/or 索引不干净,但我在调用 git_merge() 之前检查了 git status 并且它是干净。

我使用的是默认合并选项,结帐选项设置为 GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS。我尝试使用 FORCE 而不是 SAFE 但它没有帮助。我还需要做什么才能记录冲突?

代码在这里(在Swift): https://github.com/Uncommon/Xit/blob/ff1bf6312bb1250b1db432035947a282a2cdd362/Xit/XTRepository%2BMergePushPull.swift#L154

原来的问题是,由于我的单元测试刚刚使用命令行工具完成了 git commit,libgit2 的索引内存副本已过时,因此使用旧副本它认为存在冲突的索引。在调用 git_merge() 之前用 git_index_read() 重新加载索引解决了问题。

这其实是libgit2的一个bug; git_merge 应该重新加载索引本身:https://github.com/libgit2/libgit2/issues/4203