使用 libgit2sharp 中止 git 合并

Abort git merge using libgit2sharp

在 libgit2sharp 中,我正在为上游分支执行获取和合并,我希望能够中止合并,类似于:

git merge --abort

当 MergeStatus 为:

LibGit2Sharp.MergeStatus.Conflicts

目前是否可行(使用 v.0.20.1)?如果没有,有人知道实现类似的东西需要什么吗?

git-merge --abort 命令是 shorthand for git reset --mergegit-reset --mergegit-reset --hard 都会中止合并并清理存储库,他们更新修改后的文件的方式不同。

LibGit2Sharp 目前不提供与合并选项并行的重置。但是,如果您使用带有 ResetMode.Hard 选项的 Repository.Reset 方法,您的合并将被中止(尽管具有 git-reset --hard 语义)。

我试图通过预过滤传递给 reset --hard 的路径来模拟 reset --merge。我认为它具有与 reset --merge 相同的基本语义。我正在做类似这样的伪代码:

// Gather list of files modified in the index.
git_diff *index_diff;
git_diff_tree_to_index(&index_diff, repo, current_head_tree, ...);
// Iterate over index_diff to produce list of changed files.

// Gather list of files modified between index and workdir.
git_diff *workdir_diff;
git_diff_index_to_workdir(&workdir_diff, ...);
// Iterate over workdir_diff looking for files in the index list.
// Any non-conflicted files that are already in the index list
// cause the whole process to be aborted with an error. Can't reset
// merged files that have unstaged changes.

// The files in the index list are the ones that need to be reset.
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
opts.checkout_strategy |= GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH;
opts.paths = index_list;
git_reset(repo, current_head_commit, GIT_RESET_HARD, opts);

当然,这可能不是它应该在库中实现的方式。可能应该有一个检查策略,跳过在 workdir 中修改但未在索引中暂存的文件。然后可以与 GIT_CHECKOUT_USE_OURS 结合使用以丢弃冲突的文件。