如何在GitHub上更改PR的所有者/如何接管一个开放的GitHub PR

21

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

这个问题不是如何在GitHub中更改提交作者?重复...因为那个问题并没有明确说明它是否在问如何重写几个提交的作者然后将它们推送到GitHub,还是实际上更改首次创建整个PR的名称。而且,那个问题的被接受答案只是简单修复了本地.git/config文件,显然无法解决我在这里谈论的GitHub问题。


在GitHub PR的顶部,你会看到类似这样的东西:

用户名想要从其特性分支合并1个提交到基本分支

那个用户名:我们该怎么改变它?

随机选择的示例PR(从GitHub中选择)仅用于显示下面图像中的PR作者行。图片:

enter image description here

示例用例:

  1. 开此PR的团队成员刚刚离开公司,我们希望接管并完成他们的PR。
  2. 工作负载的变化使得你需要从另一个团队成员那里接管部分完成的PR。你如何将该PR切换为你的名字?

假设每个人都可以完全访问整个repo,这意味着你可以相互推送/拉取彼此的分支。

我想知道如何更改打开的PR所有者的真实例子

在2020年,我同事在一个全新的分支上开了一个PR,打算在3个月内对其进行大量功能开发。然后,将会合并它。随着每个小PR进入这个独立的长期运行的分支,将进行同行评审。

最初,PR带有“不要审核”标签,只是为了让我们的CI(持续集成)系统开始每天构建它以确保它没有问题。然后,我们所有人都会贡献到这个分支,理解到开此PR的人会成为“流程负责人”,并将该分支走过所有的测试和流程,直到将其合并回主分支。

然后,我的同事在开此PR后不久就离开了公司。我立即成为流程负责人,并为此PR工作了3个月,最终将其合并。该repo由维护者设置为禁用除“压缩合并”以外的所有合并类型(请参见本问题下面的我的评论),因此当它被合并时,GitHub将所有几十个单独提交都压缩到一个巨大的提交中,并附加我的同事的名字(请记住他在过去3个月里已经离开了公司)到那个提交中,尽管

 164 files changed, 10360 insertions(+), 3013 deletions(-)

意思是那个提交触及了164个文件,增加了10360行,删除了3013行。 而猜猜看!?我的同事的名字出现在所有这些更改中,只是因为他最初“打开了PR”,而不是我的名字,尽管其中很多工作是我的,我是其过程所有者。 至少可以说很令人困惑。 我希望我的名字出现在所有这些更改的行上。

因此,我的答案就是我当时应该做的但没有做的,因为我不知道GitHub总是使用打开PR的人的姓名,也不知道如何更改PR的所有者。 现在,我知道了,并在我的答案中记录了我的解决方法。

我实际上所做的是我的答案中的选项1,但我应该采取的是我的答案中的选项2。


为什么你不能保留开放的PR,让新人推送到分支上?你没有提到为什么现有的PR必须由不同的人“拥有”。 - bk2204
@bk2204,请看我的回答中的第一项:“继续使用他们的开放性PR,这种情况下,在你使用“压缩并合并”选项完成PR时,他们的名字而不是你的名字会附加在最终压缩和合并的提交中。” 如果您继续使用该开放式PR,在那个分支上推送您的提交,然后在最后进行GitHub“压缩合并”选项(通过单击该GUI按钮),那么打开PR的人,而不是您,会将其姓名放在合并到base_branch(通常为mastermain)的最终单个提交上。事实上,您所做的所有工作都无法在git log中找到。 - Gabriel Staples
1
请注意,你的名字出现在 their_feature_branch 的所有小提交中,但是一旦该特性分支被 GitHub "压缩合并" 到 base_branch 中后,你应该将其删除,并且 PR 的发起者(不是你)是 GitHub 附加到 base_branch 中的那个压缩提交的名称。如果 A) 该人已经离开公司数周或数月,现在却以某种方式合并了一个 PR(实际上是你做的),这可能会令人困惑和不理想;B) 如果他们在你的大部分工作中获得了他们的名字。也许他们用 10 行打开了 PR,但你完成了其他 500 行。你的名字应该出现在上面。 - Gabriel Staples
如果你使用压缩合并(squash merges),那么你实际上是在表达你想要销毁历史记录,并且你完全不关心它。你将本质上失去两个人在该分支上工作的事实,这是无法避免的。在你的情况下,你想成为提交记录中的主角,但你却忽视了你同事所做的工作。如果你关心归属问题,请不要使用压缩合并。 - bk2204
2
@bk2204,一些公司或代码仓库所有者设置他们的GitHub仓库以禁止除压缩合并之外的所有合并方式,因此选择不一定是点击合并按钮的人做出的。它可能是由公司或组织设置的,而不是用户设置的。在GitHub上的任何代码库中,您可以通过选中相应的复选框来独立允许或禁止“合并提交”、“压缩合并”和“变基合并”,从而允许或禁止这些选项。所以,对于那些没有这个选项的人,我的答案是我能想到的最好的。 - Gabriel Staples
2个回答

16
有时,任务会从一个团队成员转移到另一个团队成员,或者团队成员离开团队。当这种情况发生时,如果能够“征用”或接管他们的PR,使其成为您的PR,那将是很好的。然而,据我所知,GitHub还没有实现这个功能。Phabricator(一种付费的GitHub替代品,最初是Facebook内部使用的工具)上,这很简单,只需点击一个按钮即可进行“接管修订版”(请参见旧文档,其中提到“接管其他作者的更改”)。这被称为“接管某人的diff”,其中“diff”是Phabricator相当于GitHub PR或“Pull Request”的术语。
如何在GitHub中接管(接管)其他人的PR
即:如何更改打开PR的所有者,使它看起来像是您打开了PR,而不是他们。
因此,由于GitHub不允许接管PR,因此有以下几个选项:
  1. 如果你决定继续使用他们的开放性 PR,那么在最终的压缩合并提交中,会附上{{他们的名字}}而不是你的名字。如果他们做了大部分工作,那没问题。但是,如果你接手一个 PR 并且你完成了大部分工作,你可能希望你的名字与工作相关联。因此,可以考虑:
  2. 关闭他们的开放性 PR,并打开你自己的 PR。

要执行上述第一种选项:只需继续使用他们的开放性 PR,其中 {{他们的}} 名字会附到最后的压缩合并提交中:

  1. Check out their branch locally
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  2. Optionally, rename your local copy of their branch to something you like
    git branch -m new_branch_name
    
  3. Set the upstream for this branch so that when you git push it will push to their remote branch name which is attached to their open PR:
    git push --set-upstream origin new_branch_name:their_branch_name
    
    Note: I learned the git push -u origin local_FROM_branch:remote_TO_branch syntax here: How can I push a local Git branch to a remote with a different name easily? See also my own new answer to that question here.
  4. Now, to push you can just call:
    git push
    
  5. And to pull from that branch, in case another team-mate pushes changes to it too, you can specify:
    git pull origin their_branch_name
    
现在,只要PR完成并经过审核,您就可以通过GitHub将其合并。如果选择常规合并选项,则会为您的提交获得信用。如果选择“压缩和合并”选项,则{{原始作者}}而不是您将获得整个合并的全部信用。这很愚蠢,应该由GitHub修复,但是事实就是如此。
[我的偏好]以下是执行上述第2个选项的方法:只需关闭他们的PR并打开您自己的PR即可:
  1. Go to the bottom of their PR and click "Close pull request": enter image description here.
  2. Check out their branch locally
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  3. Optionally, but recommended, rename your local copy of their branch to something you like.
    git branch -m new_branch_name
    
  4. Push this as a new branch to the remote origin on GitHub. This pushes to your remote branch and allows you to open a NEW PR under YOUR name on GitHub:
    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. After pushing like that for the first time, GitHub will output a URL in the terminal where you pushed, which you can click on to open a new PR under your name. (If you don't have this feature, just go to Github.com and manually open up a PR there). Open a PR and voilá! It's now YOUR PR and you've just "commandeered" their PR!
  6. Now, to push you can just call:
    git push
    
  7. And to pull from that branch, in case another team-mate pushes changes to it too, you can specify:
    git pull origin new_branch_name
    
现在,当 PR 完成并经过审核后,您可以在 GitHub 上将其合并。如果选择“压缩和合并”选项,则将使用您的名称作为最终的单个提交,该提交将合并到基本分支(base_branch)中。
另请参阅:
  1. 如何轻松地将本地 Git 分支推送到具有不同名称的远程?
  2. [我刚刚添加的新答案] 如何轻松地将本地 Git 分支推送到具有不同名称的远程?

0

举个例子,当这种能力成为必要功能时:

我拥有的一个PR存在状态错误,这些错误不是分支的一部分,而是局限于该PR:

>> git checkout -b new_name; 
>> git push origin new_name;
>> opened new PR without errors. 

错误并不是在GitHub本身,而是在我们为测试环境制作的一些插件和扩展中。

但我希望IT团队调试状态损坏问题,因此我想将我的PR传递给他们(显然不包括代码或分支)。


我不认为这个回答解决了问题,虽然这是一个好的评论。 - chornge

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