我正在使用Github的 web API 来控制我自己的fork和上游。任务是从上游仓库拉出并合并到我的前叉。当发生冲突时,我希望API强制合并文件,并在文件中显示冲突,如下所示:
>>>>>>
This line is from my fork
======
This line is from upstream
<<<<<<
这可以在运行 git pull 或 git merge 时通过git客户端自动完成,但Github API(https://developer.github.com/v3/repos/merging/)只会失败,如果有的话冲突,而不是试图使冲突看起来像上面。有没有办法用Github API实现上述目的?谢谢!
答案 0 :(得分:4)
不,目前无法使用GitHub API(也不能通过GitHub UI)。不过这是一个很好的想法 - 我会提到团队考虑,如果你想分享你正在建设的更多细节,请通过support@github.com联系。
答案 1 :(得分:0)
通过结合使用GitHub Commits API和2个命令行程序,您可以非常接近重新创建此行为:merge和diff。
我猜想在您的设计中,冲突的文件会本地保存到磁盘或在Web浏览器中显示。如果您尝试在Web浏览器中执行此操作,则可能需要将下面描述的方法置于您自己的API之后。
使用Commits API,compare 2 commits。按照要合并的方向进行。来自API调用的响应中的“文件”键将为您提供所有冲突,添加和删除(我认为)的文件。
在响应json中找到的base_commit键是您要合并分支的提交。 merge_base_commit键是您的提交/分支的共同祖先和目标(即base_commit)提交/分支。这两个都处于最高水平。
对于files键中的每个文件,您需要确定是否存在该文件的merge_base_commit版本。如果是这样,那么你将进行3路合并,就像git使用merge:merge -p文件(提交[last])文件(merge_base_commit)文件(base_commit),它将为你提供你所寻找的冲突标记文件。
如果没有该文件的merge_base_commit版本,您将使用:diff -DCONFLICT文件(提交[last])文件(base_commit)。 -D参数将为您提供一个标记文件,与您想要的非常相似。替换合并标记的简单正则表达式将使其看起来像git冲突标记。
要获取文件的3个版本,请从每个文件密钥中的“contents_url”键开始。 contents_url as-is将为您提供该文件的版本。将base查询字符串参数替换为base_commit和merge_base_commit中的sha:results ['merge_base_commit'] ['sha']和结果['base_commit'] ['sha']。
拥有所有3个文件后,您可以使用合并程序进行三向合并。如果你在merge_base_commit get上得到404,这意味着你需要进行双向合并。如果你在base_commit get上得到404,这意味着你的文件在目标分支上不存在,所以从添加冲突标记的角度来看没有任何事情可做。