使用libgit2sharp中止git merge

时间:2015-01-08 11:06:28

标签: libgit2sharp

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

git merge --abort

当MergeStatus为:

LibGit2Sharp.MergeStatus.Conflicts

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

2 个答案:

答案 0 :(得分:6)

git-merge --abort命令是git reset --merge的简写,git-reset --mergegit-reset --hard都将中止合并并清理存储库,不同之处在于修改后的修改方式不同文件。

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

答案 1 :(得分:0)

我试图通过预先过滤传入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结合使用以丢弃冲突的文件。