【问题标题】:Dealing with merge conflicts in Rugged处理 Rugged 中的合并冲突
【发布时间】:2015-02-21 00:11:39
【问题描述】:

我正在编写一个需要合并的 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 并让用户解决它们?似乎我无法将其写出(它会抱怨它无法写出未完全合并的索引)并且我没有看到将当前索引设置为它的明显方法。

【问题讨论】:

    标签: git merge libgit2 rugged


    【解决方案1】:

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

    repo.index = merge_index
    merge_index.write()
    

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

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

    【讨论】:

    • 当我尝试 repo.index = merge_index 我得到 RuntimeError: The given object has beenowned by another repository
    • 您从git_merge_commits() 返回的索引不属于存储库,因此这表明某个层存在错误。
    • 好的,这可以解释为什么我遇到了麻烦 :)。我创建了一个非常简单的 repo 并编写了一个非常简单的 Ruby 脚本来测试它,它肯定会因为“对象已拥有”而失败
    猜你喜欢
    • 2012-05-09
    • 2012-12-22
    • 2023-04-07
    • 2012-03-18
    • 2013-06-06
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多