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