如何通过Github API解决合并冲突

4
我正在使用Github的web API来控制我的fork和一个upstream。任务是从upstream库拉取并合并到我的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才会批准合并请求(merge)。为什么你希望GitHub将远程分支保留在部分合并的状态? - Tim Biegeleisen
原因是在“部分合并”之后,将会有一个网页显示部分合并的文件,用户可以像使用git客户端一样手动编辑并解决冲突。 - menphix
1
支持此功能意味着存储库上的远程分支可能处于瞬态状态。如果同事尝试拉取或推送处于合并冲突状态的分支,您将如何处理这个问题? - Tim Biegeleisen
2个回答

6

目前,使用GitHub API(也不通过GitHub UI)是不可能的。不过这是一个很好的想法,我会向团队提出讨论。 如果您想分享更多有关您正在构建的内容,请通过support@github.com联系我们。


谢谢你的回复,伊万!我会发送一封电子邮件到support@github.com,并详细说明。 - menphix
@menphix - 我和你情况一样。GitHub API 上有解决办法或者建议吗? - Rakesh Sajja
Samsies。似乎不会有“force”标志。 - MindlessRouse

1
你可以通过使用 GitHub Commits API 和 2 个命令行程序:mergediff 的组合,接近于重新创建此行为。
我猜在你的设计中,冲突文件被保存在本地磁盘或在 Web 浏览器中呈现。如果你想在 Web 浏览器中执行此操作,则可能需要将下面描述的方法放在自己的 API 后面。
使用 Commits API,比较 2 个提交。按你想要合并的方向进行比较。API 调用响应中的“files”键将提供所有冲突、添加和删除(我认为)的文件。

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

对于files键中的每个文件,您需要确定是否存在文件的merge_base_commit版本。如果是,则像git一样使用merge: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将获得文件的版本。将ref查询字符串参数替换为您的base_commit和merge_base_commit的sha:results ['merge_base_commit'] ['sha']和results ['base_commit'] ['sha']。

一旦您拥有了所有3个文件,您可以使用合并程序进行三方合并。如果您在merge_base_commit获取时得到404,则意味着您需要进行两方合并。如果您在获取base_commit时得到404,则意味着您的文件不存在于目标分支上,因此从添加冲突标记的角度来看,没有任何事情可做。

谢谢webfanatic!我得尝试一下,看看它是否适用于我,但看起来很有希望!其中一个问题是我无法在我的环境中运行任何Linux命令/程序,所以我需要找出纯Python的解决方案。您的建议绝对是一个好的起点。 - menphix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接