如何解决与 Github API 合并的冲突

How to resolve conflict with merging with Github API

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

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

当 运行 git pull[=28= 时,这可以通过 git 客户端自动完成] merge,但是 Github API (https://developer.github.com/v3/repos/merging/) 只会在发生冲突时失败,而不是试图让冲突看起来像上面那样。有什么办法可以用Github API达到上述目的吗?谢谢!

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

通过组合使用 GitHub Commits API and 2 command line programs: merge and diff.

,您可以非常接近于重新创建此行为

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

随着提交 API、compare 2 commits。按照您要合并的方向进行。 API 调用响应中的 'files' 键将为您提供所有冲突、添加和删除(我认为)的文件。

在响应 json 中找到的 base_commit 键是您要将分支合并到其中的提交。 merge_base_commit 键是您的 commit/branch 和目标(即 base_commit)commit/branch 的共同祖先。这两者都处于最高水平。

对于文件键中的每个文件,您需要确定该文件是否存在 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 get 上得到 404,这意味着您需要进行双向合并。如果你在 base_commit get 上得到 404,这意味着你的文件在目标分支上不存在,所以从添加冲突标签的角度来看没有什么可做的。