【问题标题】:How to resolve conflict with merging with Github API如何解决与 Github API 合并的冲突
【发布时间】:2016-03-04 20:48:16
【问题描述】:

我正在使用 Github 的 web API 来控制我自己的分叉和上游。任务是从上游 repo 中提取并合并到我的 fork 中。当发生冲突时,我希望 API 强制合并文件,并在文件中显示冲突,如下所示:

>>>>>>
This line is from my fork
======
This line is from upstream
<<<<<<

这可以在运行 git pullgit merge 时使用 git 客户端自动完成,但 Github API (https://developer.github.com/v3/repos/merging/) 只会在发生冲突时失败,而不是试图使冲突看起来像上面。有什么方法可以通过 Github API 实现上述目标?谢谢!

【问题讨论】:

  • 我的理解是,GitHub只有在没有冲突的情况下才会批准拉取请求(合并)。为什么要让 GitHub 将远程分支留在部分合并状态?
  • 原因是“部分合并”后会有一个网页显示部分合并的文件,用户可以手动编辑和解决冲突,就像用git客户端做的一样。
  • 支持此功能意味着存储库上的远程分支可能处于临时状态。您将如何处理同事试图拉取或推送到合并冲突中的分支的问题?

标签: git github merge github-api


【解决方案1】:

不,目前不能使用 GitHub API(也不能通过 GitHub UI)。不过,这是一个好主意——我会向团队提及它以供考虑,如果您想分享有关您正在构建的内容的更多详细信息,请通过 support@github.com 联系。

【讨论】:

  • 感谢伊万的回复!我会发邮件到support@github.com 详细解释一下。
  • @menphix - 我在同一条船上。 GitHub API 对此有何修复或任何建议?
【解决方案2】:

通过结合使用 GitHub Commits API 和 2 个命令行程序:mergediff,您可以非常接近地重新创建此行为。

我猜想在您的设计中,冲突的文件会保存在本地磁盘或网络浏览器中。如果您尝试在 Web 浏览器中执行此操作,您可能需要将下面描述的方法放在您自己的 API 后面。

使用提交 API,compare 2 commits。朝要合并的方向进行。 API 调用响应中的“文件”键将为您提供所有冲突、添加和删除(我认为)的文件。

在响应 json 中找到的 base_commit 键是您要合并分支的提交。 merge_base_commit 键是您的提交/分支和目标(即 base_commit)提交/分支的共同祖先。这两个都是顶级的。

对于 files 键中的每个文件,您需要确定该文件是否存在 merge_base_commit 版本。如果是这样,那么您将进行 3 路合并,就像使用合并的 git 一样:merge -p file(commits[last]) file(merge_base_commit) file(base_commit) 这将为您提供您寻找的冲突标记文件。

如果文件没有 merge_base_commit 版本,您将使用:diff -DCONFLICT file(commits[last]) file(base_commit)。 -D 参数将为您提供一个标记的文件,与您想要的非常相似。一个简单的正则表达式替换合并标签将使它看起来像 git 冲突标签。

要获取文件的 3 个版本,请从每个文件键中的“contents_url”键开始。 contents_url 原样将为您提供您的文件版本。用 base_commit 和 merge_base_commit 中的 sha 替换 ref 查询字符串参数:results['merge_base_commit']['sha'] 和 results['base_commit']['sha']。

一旦您拥有所有 3 个文件,您就可以使用合并程序进行三向合并。如果您在 merge_base_commit 获取 404,这意味着您需要进行双向合并。如果你在 base_commit get 上得到 404,这意味着你的文件在目标分支上不存在,所以从添加冲突标签的角度来看,没有什么可做的。

【讨论】:

  • 感谢网络狂热者!我将不得不尝试一下,看看它是否对我有用,但看起来很有希望!一件事是我无法在我的环境中运行任何 linux 命令/程序,所以我必须用纯 python 找出一些东西。您的建议绝对是一个很好的起点。
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 2017-10-27
  • 1970-01-01
  • 2012-10-24
  • 2012-03-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多