处理Rugged中的合并冲突

时间:2015-02-21 00:11:40

标签: git merge libgit2 rugged

我正在开发一个需要进行合并的Ruby脚本。我想做的是,给定目标引用和合并尝试合并它们的提交,如果存在合并冲突,则将控制权交还给用户以解决它们,基本上与git merge完全一样,所以用户可以处理冲突,然后拨打git my-merge --continue并继续我们离开的地方。

到目前为止我所拥有的是:

merge_index = @repo.merge_commits(@commit, target_tip, options)
unless merge_index.conflicts?
options = {
    :committer => @commit.committer,
    :author => @commit.author,
    :parents => [target_tip, @commit],
    :message => merge_message,
    :update_ref => @target.canonical_name,
    :tree => merge_index.write_tree(@repo)
}

commit = Rugged::Commit.create(@repo, options)
else
    # Here's where my unwritten code goes 
end

问题是:鉴于merge_index我遇到了一些冲突,如何让我的工作目录进入其所代表的状态,以便我可以返回shell并让用户解决它们?我似乎无法写出来(它会抱怨它无法写出一个未完全合并的索引)而且我没有看到一种明显的方法来设置我当前的索引。

1 个答案:

答案 0 :(得分:0)

合并索引是合并的结果。如果您希望将其作为存储库的状态,则需要将该索引编写为存储库的索引,例如

repo.index = merge_index
merge_index.write()

然后您可以像往常一样使用checkout,这将在工作树中的文件上创建冲突标记。

libgit2本身有git_merge()这样做是为了你;如果您不想执行代码中的步骤,可能需要考虑通过坚固的方式使其可用。