I'm working on implementing merge using libgit2, and I'm having trouble getting it to deal with conflicts (changes to the same line in a file) - the merge just aborts, with nothing written to the index or to the workspace. Resolvable conflicts (changes to different lines) are working fine.
It exits with GIT_ECONFLICT
, which apparently indicates that the worktree and/or index aren't clean, but I checked with git status
just before calling git_merge()
and it's clean.
I'm using default merge options, and checkout options set to GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS
. I tried using FORCE
instead of SAFE
but it didn't help. What else do I need to do so the conflicts are recorded?
Code is here (in Swift): https://github.com/Uncommon/Xit/blob/ff1bf6312bb1250b1db432035947a282a2cdd362/Xit/XTRepository%2BMergePushPull.swift#L154
It turned out the problem was that, since my unit test had just done a git commit
using the command line tool, libgit2's in-memory copy of the index was out of date, so using that old copy of the index it thought there was a conflict. Reloading the index with git_index_read()
before calling git_merge()
solved the problem.
This is actually a bug in libgit2; git_merge
should be reloading the index itself: https://github.com/libgit2/libgit2/issues/4203