在libgit2sharp中我正在为上游分支进行提取和合并,我希望能够中止合并,类似于:
git merge --abort
当MergeStatus为:
时 LibGit2Sharp.MergeStatus.Conflicts
目前是否可以使用(使用v.0.20.1)?如果没有,是否有人知道实现类似的东西需要什么?
答案 0 :(得分:6)
git-merge --abort
命令是git reset --merge
的简写,git-reset --merge
和git-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
结合使用以丢弃冲突的文件。