如何在Github上将新的Pull Request添加到现有问题中?

422
我不确定,但我有一个模糊的记忆,创建了一个标题带有“Issue 4”或类似内容的Github拉取请求,并自动将其附加到我正在提交的项目中的Issue 4。最近我又尝试了一下,但没能成功-- 它只是创建了一个全新的问题。在新的拉取请求页面上,我没有看到任何“附加到问题”之类的选项,也没有在问题页面上看到“为此问题打开新的拉取请求”的选项。是否有任何方法可以做到这一点,以帮助项目所有者保持其问题页面干净并避免重复?
编辑:为了澄清,我知道创建拉取请求总是会创建一个新问题。我想将拉取请求附加到现有的问题上。

1
我相信我的回答表达了一个事实,即您想要的功能(“将拉取请求附加到现有问题”)可能尚未存在。 - VonC
我希望那个功能在 Github 的优先级列表中排名很高,因为那里的代码会喜欢它! - flq
2
正确答案应该改为masukomi的,因为现在有“fixes #1”方法可用。无需通过API进行操作。 - Edward Anderson
正确答案应该改为Christian Oudard的答案。虽然masukomi的答案仍然有价值,但它实际上并没有提交拉取请求。它只是将提交与现有问题相关联。GitHub有能力显示代码是否附加到问题上,这只能通过关联的拉取请求完成。 - Ryan McGeary
@RyanMcGeary 好的,我想你是对的。已经切换了。 - Tyler
显示剩余2条评论
10个回答

257
向现有上游问题添加拉取请求很容易,假设您使用了正常的github手段进行了分叉。只需在提交消息中使用任何支持的关键字引用问题即可:
  • close
  • closes
  • closed
  • fix
  • fixes
  • fixed
  • resolve
  • resolves
  • resolved
例如:"this commit fixes #116"。引用问题的文本不需要出现在提交的主题行中。
将更改推送到您的github存储库,拉取请求将自动附加到问题上。请注意:虽然不是必需的,但强烈建议您将任何将成为拉取请求一部分的提交提交到特定于该问题的单独分支中,因为该分支上的未来提交将被附加到拉取请求(由github自动完成)。如果您没有创建单独的分支,而是将其留在主分支上,然后继续开发,则所有与主分支无关的提交都将附加到您的拉取请求中。

35
“强烈推荐将任何将成为拉取请求一部分的内容提交到与该问题相关的单独分支中,因为该分支上的未来提交将附加到拉取请求中。” ——非常好的建议。我曾经遇到过这种情况,感到相当意外。 - Tyler
9
很遗憾,这并不能解决将问题转换为pull request的问题。在问题中进行的任何讨论都不会被转移到pull request中... 这对于一些使用情况来说是很不幸的。我希望Github能够在存储库设置中提供一些关于如何处理pull request的细粒度控制。 - Alex Waters
1
我不确定为什么您需要将问题转换为拉取请求。在问题的对话中提到拉取请求不足吗?通过在拉取请求中引用#,这将自动发生。您有一个对话线程。然后您有一个包含相关拉取请求的线程。听起来很完美。 - masukomi
2
我认为你没有理解我的意思,Rory。如果你创建了一个拉取请求并在问题中提到它(正如我建议的那样),那么这两个是相互关联的,你仍然可以点击一个按钮来获取更改。 - masukomi
2
这并不适用于拉取请求正在进行的情况。我们的工作流程是为想法创建问题,然后从功能分支拉取拉取请求,一旦我们开始处理这些想法。在拉取请求中使用提交关闭问题意味着我们会失去以前包含在问题中的讨论,其中通常包括梳理问题所涉及的任何功能/修复/重构。真正需要的是一种方法,在问题开始处理后,直接将问题转换为拉取请求。 - Daniel Bingham
显示剩余2条评论

245

Hub 项目能够实现此功能。

在你想要发送拉取请求的仓库和分支中:

$ hub pull-request -i 4

这个代码使用了GitHub API,并将当前分支的拉取请求附加到现有问题号4上。


编辑:@atomicules的评论:为了扩展@MichaelMior的答案,下面是一个完整的示例:

$ hub pull-request -i 4 -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE

14
使用Homebrew来安装hub,命令为brew install hub - gcamp
11
对我来说这个不起作用。显示错误:创建拉取请求时出错:不可处理的实体(HTTP 422)。 - Rubycut
11
@Rubycut 我曾经遇到同样的问题。相反,我使用了'hub pull-request URL_TO_ISSUE',然后就可以正常工作了。我想知道如果问题不在同一个仓库(即不是派生版本),那么'-i ISSUE_NUMBER'是否有效。 - Michael Mior
30
@MichaelMior的回答可以进一步解释为:完整的示例是:hub pull-request -b 上游拥有者的用户名:上游分支 -h 您的用户名:您的分支 问题的URL链接 - atomicules
4
注意,这个方法仅适用于你创建的问题:https://github.com/defunkt/hub/issues/189#issuecomment-6353354 - Zach
显示剩余12条评论

144

您可以使用Pull Request API从现有的问题创建拉取请求:

$ curl --user "smparkes" \
       --request POST \
       --data '{"issue": 15, "head": "smparkes:synchrony", "base": "master"}' \
       https://api.github.com/repos/technoweenie/faraday/pulls

这将创建一个pull request:

  • 请求 technoweenie 在项目 faraday (https://api.github.com/repos/technoweenie/faraday/pulls) 上进行拉取操作
  • smparkes 的分支("head": "smparkes:synchrony")进行拉取
  • technoweenie 的分支 master 里("base": "master")
  • 并将pull request附加到问题15("issue": 15
  • 与pull request的作者 smparkes(--user "smparkes")
  • 您将被提示输入GitHub密码

1
我复制了那个链接中的一些示例代码。希望你不介意,如果我翻译错了,请告诉我! - Tyler
3
您需要进行身份验证,将以下命令加上此选项:-u "登录名:密码" - morgoth
2
我想补充一下,这种方法仍然有效,但是如果GitHub已经从其消息中隐式地获取了问题#,则可能会导致在讨论页面上列出您的提交两次(例如)。 (https://github.com/ask/celery/pull/450)。但是,在官方拉取请求上,提交只会通过一次。 - Greg Haskins
3
可以将它更新到v3 API吗?GitHub刚刚关闭了v2 API。 - Michael Best
1
如我在我的回答中所说,将--user "smparkes:password"更改为--user"smparkes"以交互方式提示输入密码。 - Rory O'Kane
显示剩余7条评论

17

10

这个答案解释了如何使用cURLcurl)通过GitHub API从问题创建一个拉取请求。这里是使用HTTPiehttp)进行操作的方法,它可以生成更易于阅读和编辑的命令:

$ http --auth "<your-GitHub-username>" \
       POST \
       https://api.github.com/repos/<issue-repo-owner>/<issue-repo-name>/pulls \
       issue=<issue-number> head=<your-GitHub-username>:<your-fork-branch-name> base=<issue-repo-branch-name>

当提示时,请输入您的GitHub密码。

示例说明

您使用用户名smparkes和密码hunter2登录了GitHub。您看到了technoweenie的仓库faraday,想到了一些应该改变的东西,并在该仓库上创建了一个问题Issue #15。后来,您发现没有其他人提出您的建议更改,而且您也有一些时间来自己完成它。您fork faraday to your own account,然后编写您的更改并将其推送到命名为synchrony的分支下的您的派生分支中。您认为technoweenie应该将这些更改拉取到他的仓库的master分支中。这是您将以前的问题转换为拉取请求的命令:

$ http --auth "smparkes" \
       POST \
       https://api.github.com/repos/technoweenie/faraday/pulls \
       issue=15 head=smparkes:synchrony base=master

http: password for smparkes@api.github.com: hunter2

现在 问题 #15 是一个拉取请求。

5
与其在客户端(如hub,参见Christian Oudard答案)中执行此操作,您现在(2020 年 2 月)可以在服务器端(github.com)上执行。

请参阅“从侧边栏查看并链接问题和拉取请求”。

现在,您可以通过各自的页面侧边栏链接问题和拉取请求。在此处建立的连接将在链接的拉取请求合并后自动关闭问题。

文档: https://help.github.com/assets/images/help/pull_requests/link-issue-drop-down.png

还有一个带有该功能的搜索 API

使用linked:pr 搜索修饰符,可以在存储库中找到所有具有关闭拉取请求引用的未解决问题。
类似地,使用-linked:issue 可以找到存储库中缺少支持问题的所有拉取请求。


Ismoh评论中提到了以下讨论:

"GitHub Action: Pull request 'development' object/data, aka linked issues"

以及 Ismosh 的Marketplace 操作,用于查找拉取请求的链接问题

    - name: Find linked issues
      id: find-linked-issues
      uses: Ismoh-Games/find-linked-issues@v0.0.1
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        repository: ${{ github.repository }} # optional
        pull-request-number: ${{ github.event.pull_request.number }} # optional
        copy-issues-labels: true # optional

搜索 API 听起来很有前途。我仍然不明白为什么它不在 REST API 拉取请求中,但很好知道! - Ismoh
1
@Ismoh 你可以尝试使用官方 GitHub CLI gh pr list --search <query> 并结合搜索链接问题和拉取请求的语法进行搜索。 - VonC

3

如果您在Github中使用双因素身份验证,您需要将授权令牌作为请求头提供:

curl -u "<your_username>:<your_pw>" \
     --header 'X-GitHub-OTP: <your_authtoken>' \
     --request POST \
     --data '{"issue":"<issue_nr>", "head":"<your_username>:<your_forks_branchname>", "base":"<upstream_branch>"}' \
     https://api.github.com/repos/<upstream_user>/<upstream_repo>/pulls

1
是的,双因素认证会防止很多答案的工作。在我的情况下,我创建了一个个人访问令牌并使用它而不是我的密码,这有效。 - berto

1

您也可以使用Gub提交拉取请求以解决您的问题。

这还可以帮助您使用适当的fork/pull-request风格。

编辑:2013年10月5日

要让Gub为第123个问题提交拉取请求,您需要运行以下命令:

$ gub start 123

这将创建一个名为issue-123的新分支。完成问题的处理后,执行以下操作:
$ gub finish

Voila!

注意:我是Gub gem的作者。


0
如果您启用了2FA,您可以使用HTTPie传递令牌:
http POST \
    https://api.github.com/repos/<repo-owner>/<repo-name>/pulls \
    issue=2 head=issue_2 base=master
    "Authorization:token PUTAUTHTOKENHERE"

这将使用分支issue_2将问题#2转换为拉取请求。


0
使用git-hub工具,您可以通过以下方式完成此操作: $> git hub pull attach 123 这将把问题#123转换为拉取请求#123,从而在单个位置维护有关该问题的所有讨论。

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