如何保护 Github 中的 "master" 分支?

60

我在github项目中有几个贡献者,我想只允许其中一个人“push”到主分支(master)。而这个人不是我(仓库所有者)。是否可以实现?


这是一个私人项目吗?如果不是,他们不一定需要成为合作者 - 他们可以分叉并仅使用拉取请求(这强制执行伪代码审查级别以合并更改)。 - Daenyth
1
这个功能不受Github支持,但如果您正在寻找类似的解决方案:Assembla Repositories支持此功能:http://blog.assembla.com/assemblablog/tabid/12618/bid/96330/Put-Down-Your-Forks-Introducing-Protected-Branches.aspxDIY - 自托管Git:http://git-scm.com/book/ch7-4.htmlDIY - 自托管Mercurial:http://mercurial.selenic.com/wiki/AclExtension - Titas
请参见https://dev59.com/gG435IYBdhLWcg3w-1Z_#5097437。 - VonC
可能是 限制Git分支访问的方法? 的重复问题。 - Ciro Santilli OurBigBook.com
2015年9月:看起来那个功能即将在GitHub推出:请参见我下面的回答 - VonC
现在似乎(或多或少)是可能的了;https://github.com/blog/2137-protected-branches-improvements。现在可以将特定分支的推送访问权限限制为某些用户。但管理员将能够无论此设置如何进行推送。 - Sander
4个回答

39
在这个问题被发布的时候,GitHub还不支持在分支级别上指定访问权限,只能在存储库级别上进行。因此,您所请求的是不可能实现的。
如果您想解决这个限制,我个人认为有两个选项:
- 您可以使用某种提交挂钩等方法,至少通知某个人发生了错误。 - 如果您真的需要这种严格的控制,您可以使用两个存储库,一个仅包含您的“master”分支。然后,您需要确保只有您的“guy”获得对主存储库的写访问权限。
我认为用一些组织方法来解决这个问题更容易。在我的团队中,我们从不直接推送到主分支,而总是创建拉取请求。这确保了在代码合并之前至少有人查看,您还可以定义一个政策,只允许您的“guy”合并拉取请求。
更新

GitHub现在宣布他们将推出一个名为“受保护分支”的新功能。这个功能在其他Git发行版(如Atlassian Stash)中已经存在了多年。它将允许您保护一些分支不被推送。然而,它仍然不允许对单个分支进行完全基于ACL的保护。因此,如果您不想依赖上述组织解决方案,您可能需要查看此功能。


3
“我们从不直接推送任何内容到主分支” - 是因为你无法还是因为你同意不这样做? - yegor256
5
因为我们都同意不这样做。有时候找到一种软性解决方案比技术解决方案更容易。 - Sebi
1
顺便说一下,我认为这是Git/GitHub工作流程中的一个普遍问题!大多数贡献者都试图首先提交到主分支,在我看过的所有项目中都是如此... - Sliq
如果你遇到这些问题,你可能还想看看其他托管服务/工具,比如Atlassian Stash。它们提供基于分支的权限。 - Sebi
Assembla拥有一套良好的功能,可以实现不同的git工作流和代码审查过程。在Assembla中,您可以保护任何分支并授予特定用户写入权限。一个很好的功能是“强制代码审查”; 当有人推送到主分支时,它将保持不变,并创建一个新分支来代替代码更改,然后自动从新分支创建合并请求到主分支,以便其他团队成员可以审查/批准更改。 - Mauricio Sánchez
我们通过挂钩和CI端的保护措施来防止意外推送到主分支:http://dimaip.github.io/2015/06/03/protecting-github-branch/。 - Dmitri Pisarev

13
注意:受保护的分支和必要状态检查(2015年9月3日)将允许您保护一个分支,以防止被强制推送、删除,并且在必要的状态检查通过之前防止合并更改。

https://cloud.githubusercontent.com/assets/25792/9596474/27db3ce6-502a-11e5-9b19-5b47a8addc65.png


自2016年3月起,如下所述评论Sander,您有用户和团队限制

有时将合并到受保护分支的操作最好留给发布经理或负责该特定分支稳定性的团队。组织现在可以指定哪些成员和团队能够将更改推送到受保护的分支。

https://cloud.githubusercontent.com/assets/4719/14140705/ed98abac-f67a-11e5-951e-b48c842fb77f.png


5
遗憾的是,您仍然无法将分支访问限制为特定成员......希望主分支能拥有这个功能。 - Pratik Bothra
3
我同意,或者至少可以将合并限制为仅管理员能够在受保护的分支中进行。 - deankarn
1
@PratikBothra https://github.com/blog/2137-protected-branches-improvements 看起来现在是可能的了。 :) - Sander
1
@Sander 我同意。我已经相应地编辑了答案。 - VonC

3

这正是fork被设计出来的目的。你可以将主仓库保护起来,并允许所有贡献者对该仓库进行读取权限。这些贡献者会fork该仓库并将更改推送到他们个人的主仓库副本中。当他们准备将代码引入主仓库时,他们会提交一个拉取请求到主仓库。在这种情况下,主项目的所有者可以完成拉取请求。


4
使用分支/PR工作流的问题在于,在主要代码库上拥有“写入”权限的成员仍然可以将代码推送到该库。 - G. Stoynev

0
现在我们可以使用“CODEOWNERS”文件,要求代码所有者审核拉取请求。我们可以根据他们的GitHub账户设置不同的权限。
请参见此处此处

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