【问题标题】:How to change the owner of a PR on GitHub / How to commandeer an open GitHub PR如何更改 GitHub 上 PR 的所有者 / 如何征用开放的 GitHub PR
【发布时间】:2021-06-06 21:21:26
【问题描述】:

我发现 GitHub 中缺少的这个功能令人沮丧,所以我在这里记录我的解决方法以帮助下一个人。欢迎使用其他更好的解决方法。

这个问题不是How to change the author of a PR in GitHub? 重复 ...因为这个问题不清楚是否是询问如何重写一些作者提交并将它们推送到 github,或者实际上更改最初创建整个 PR 的名称。而且,该问题的公认答案是对本地 .git/config 文件的简单修复,这显然无法解决我在这里谈论的 GitHub 问题。


在 GitHub PR 的顶部,您会看到如下内容:

username 想将1 提交从their_feature_branch 合并到base_branch

Example PR (chosen "at random" from GitHub, just to show the PR author line in the image below)。图片:

那个username:我们怎样才能改变它?示例用例:

  1. 开这个PR的队友刚离开公司,我们想征用(接手)为他们完成PR。
  2. 工作量的变化需要你从另一个队友那里接管一个部分完成的 PR。如何将 PR 更改为您的名字?

假设每个人都拥有对整个 repo 的完全推送访问权限,这意味着您无论如何都可以向/从彼此的分支推送/拉取。

【问题讨论】:

  • 为什么不能只保留公开的 PR 并让新人推送到分支?你还没有提到为什么现有的 PR 必须由不同的人“拥有”。
  • @bk2204,请参阅我的回答中的第 1 条:“继续使用他们的公开 PR,在这种情况下,他们的名字,而不是你的名字,会附加到最终的、压缩和合并的提交中,如果你使用“Squash and merge”选项来完成 PR。”如果您继续使用该打开的 PR,将您的提交推送到该分支,然后在最后执行 GitHub“压缩合并”选项(通过单击该 GUI 按钮),打开 PR 的人,而不是您,将在合并到base_branch(通常是mastermain)的最终单个提交。在git log 中找不到您完成所有工作的事实。
  • 要清楚,你的名字出现在their_feature_branch 中的所有小提交上,但是一旦该功能分支被 GitHub “压缩合并”到 base_branch 你应该删除它,并且打开PR,而不是你,是 GitHub 附加到 base_branch 的 1 个压缩提交的名称。如果 A)这个人在几周或几个月前离开公司,现在以某种方式合并了一个 PR(实际上是你这样做的),并且 B)如果他们的名字出现在你的大部分工作中,这可能会令人困惑和不理想。也许他们用 10 行打开 PR,但你做了其他 500 行。你的名字应该在上面。
  • 如果你使用 squash 合并,你实际上是在说你想破坏历史并且你根本不关心它。你本质上会失去两个人在那个分支上工作的事实,而且没有办法解决这个问题。在你的情况下,你想成为提交的一方,但是你忽略了你的同事所做的工作。如果您关心归因,请不要使用 squash 合并。
  • @bk2204,一些公司或 repo 所有者设置他们的 GitHub repos 以禁止除 squash 合并之外的所有类型的合并,因此选择不一定是单击合并按钮的那个。它可能由公司或组织设置,而不是用户设置。在 GitHub 上的任何 repo 上,您可以通过选中 repo --> Settings --> Options --> 下的相应复选框来独立允许或禁止“merge commits”、“squash merging”和“rebase merging”(向下滚动到“合并按钮”部分)--> 选择复选框。所以,对于那些没有这个选项的人,我的答案是我能想到的最好的答案。

标签: github version-control pull-request


【解决方案1】:

有时,任务会从一个团队成员传递给另一个团队成员,或者团队成员离开团队。发生这种情况时,最好“指挥”或接管他们的 PR,使其成为您的 PR。 据我所知,这在 GitHub 上还不可能。

Phabricator(GitHub 和originally an internal tool used at Facebook 的付费替代品)上,只需单击按钮即可“Commandeer Revision”(参见old documentation here under "Take over another author's change")。这被称为“指挥某人的差异”,这里的“差异”是 Phabricator,相当于 GitHub PR,或“拉取请求”。

如何在GitHub上霸占别人的PR;即:如何更改打开的 PR 的所有者,这样看起来像是您打开了 PR,而不是他们。

所以,由于 GitHub 不允许征用 PR,这里有一些选项:

  1. 继续使用他们的公开 PR,在这种情况下,他们的名字,如果你使用“压缩和合并”选项来附加到最终的、压缩和合并的提交中完成公关。如果他们完成了大部分工作,那很好。但是,如果您正在接管 PR 并且您正在做大部分工作,您可能希望您的名字附在工作上。所以,改为:
  2. 只需关闭他们打开的 PR 并打开您自己的 PR。

要执行上面的选项 1:继续使用他们的开放 PR,其中他们的名字会附加到最终的、压缩的合并提交中:

  1. 在本地查看他们的分支
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  2. (可选)将其分支的本地副本重命名为您喜欢的名称
    git branch -m new_branch_name
    
  3. 为这个分支设置上游,这样当你git push它会推送到他们的远程分支名称,它附加到他们的打开的PR:
    git push --set-upstream origin new_branch_name:their_branch_name
    
    注意:我在这里学习了git push -u origin local_FROM_branch:remote_TO_branch 语法:How can I push a local Git branch to a remote with a different name easily? 另见my own new answer to that question here
  4. 现在,要推送,您只需调用:
    git push
    
  5. 如果要从该分支中​​提取,以防其他队友也向其推送更改,您可以指定:
    git pull origin their_branch_name
    

现在,只要 PR 完成并经过审核,您就可以通过 GitHub 合并它。如果您选择常规合并选项,您将获得提交的功劳。如果您选择“压缩和合并”选项,原作者,您不会获得整个合并的全部功劳。这是愚蠢的,应该由 GitHub 修复,但是,就是这样。

这里是如何做上面的选项 2:只需关闭他们的 PR 并打开你自己的:

  1. 转到他们的 PR 底部并单击“关闭拉取请求”:
  2. 在本地查看他们的分支
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  3. 或者,但推荐,将您的本地分支重命名为您喜欢的名称。
    git branch -m new_branch_name
    
  4. 将此作为新分支推送到 GitHub 上的远程 origin。这会推送到 your 远程分支,并允许您在 GitHub 上以您的名字打开一个新 PR:
    git push --set-upstream origin new_branch_name
    # Note: if you didn't rename the branch to `new_branch_name` above, 
    # and it is therefore still called `their_branch_name` locally, just
    # use `their_branch_name` here instead.
    
  5. 第一次这样推送后,GitHub会在你推送的终端输出一个URL,你可以点击打开一个新的PR在你的名下。 (如果你没有这个功能,去 Github.com 并在那里手动打开一个 PR)。打开公关,瞧!现在是你的公关,你刚刚“征用”了他们的公关!
  6. 现在,要推送,您只需调用:
    git push
    
  7. 如果要从该分支中​​提取,以防其他队友也向其推送更改,您可以指定:
    git pull origin new_branch_name
    

现在,当 PR 完成并经过审核后,您可以将其合并到 GitHub 上。如果您选择“squash and merge”选项,您的名称现在将用于合并到 base_branch 的最终单一提交。

另见:

  1. How can I push a local Git branch to a remote with a different name easily?
  2. [我刚刚添加的我自己的新答案]How can I push a local Git branch to a remote with a different name easily?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2018-06-15
    • 2019-02-09
    • 2021-12-13
    • 1970-01-01
    • 2017-05-21
    • 2020-10-17
    相关资源
    最近更新 更多