一种限制Git分支访问的方法?


70

我的git仓库中有四个分支,使用GitHub进行管理:

  • 生产
  • 分期
  • [人名]-发展

有没有办法将写访问权限限制为仅一个分支([人的名字]-开发)?我该怎么做?

作为参考,有一个类似的问题:如何编写git钩子以限制写入分支?


我知道这个问题已经过时了。但是请看一下help.github.com/articles/about-branch-restrictions
Raymond Chenon

Answers:


49

使用GitHub时,最好的选择是让每个开发人员都拥有自己的主存储库分支。每个人都推送到自己的存储库,而拥有对主存储库的推送访问权限的人则处理从每个开发人员的存储库中提取的内容。大多数开源项目就是这样工作的。

如果使用您自己的Git服务器,则应该可以使用钩子来防止用户推送到错误的分支。


有关使用钩子的信息,请查看stackoverflow.com/questions/4114417/…可能不是一个好主意吗?
软件先知


11

注意:受保护的分支和必需的状态检查(2015年9月3日)不会完全允许单个分支(“ [人的名字]-开发”),但会被克隆。

该分支将受到保护:

  • 反对强行推
  • 反对删除
  • 针对合并的更改,直到通过所需的状态检查为止

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


1
应该可以添加一个“检查”,该检查基本上检查提交是否来自授权用户。您可能无法根据提交本身来弄清这一点(因为任何人都可以伪造电子邮件),但是您可以例如拥有一个应用,在该应用中,授权用户可以在推送之前将提交哈希列入白名单。
有趣的是

另一种选择:制作一个应用程序,该应用程序允许审查传入的推送,并且如果在某个时间段内没有授权的人确认传入的推送,则会自动将其拒绝。
有趣的是

@interestinglythere你的第一个评论是什么gitolite被覆盖(gitolite.com/gitolite/gitolite.html#overviewstackoverflow.com/a/10888358/6309
VonC

Gitolite是一个git托管系统;它旨在替换GitHub之类的服务。它可以处理权限,但只能处理其托管的git repos。因此,它不能用于维护GitHub上的推送访问控制。
有趣的是

@interestingly那里我同意。我只是提到与“授权”功能有关的gitolite,而不是与GitHub有关。
VonC

10

您可能想查看GitLab及其“受保护的分支”功能。我认为这几乎就是您要寻找的。请参阅保护代码


7

Esko提出了适合开源项目的出色解决方案。但是,这要求协作者团队的每个成员在GitHub上都有一个付费帐户,这并不总是正确的。

VonC指出,还有另一种解决方案,仅涉及一个付费GitHub帐户。我将提供一些教程,说明如何实现VonC的解决方案。

假设我们有两个私有存储库:test-testtest-production。第一个存储库用于开发,团队的每个成员都可以使用它。第二个存储库用于自动部署代码,因此对它施加了严格的访问限制。

为开发人员设置的过程非常简单而且很简单: git clone https://github.com/<username>/test-test完成他们的工作并将其推后。

协作者的设置要复杂一些:

  1. 从开发仓库中拉分支 git clone https://github.com/<username>/test-test

  2. 添加远程存储库 git remote add production-repo https://github.com/<username>/test-production.git

  3. 从新仓库中获取数据 git fetch production-repo

  4. 为生产代码创建新的本地分支并切换到该分支 git checkout -b local-production

  5. 告诉git链接本地和远程分支 git branch -u production-repo/production

  6. 将远程生产分支的内容下载到本地 git pull

  7. 找出可能的冲突,就是这样!

现在,从local-production分支推送的所有内容都将进入test-production仓库,而其他分支将被推送到test-test仓库。

好的,这很酷,但是更精细的([人的名字]-开发)访问又如何呢?-你可能会问。答案是:您可以test-test为每个开发人员创建类似的存储库,并使用相同的模式进行设置。这种方法的缺点是协作者​​必须克隆每个存储test-test-[person's name]-development库。

VonC还建议分叉该production仓库并向其发出请求请求-为什么不这样做呢?首先,因为您不能在没有支付GitHub帐户的情况下派生私人仓库。其次,要允许某人分叉私人仓库,您可以给他完全访问权限,这样他就可以直接推送到它。开发人员可能会犯一个错误,将其推送到production仓库中以启动GitHub服务挂钩并搞砸了。而且,如果您使用多个外包开发人员,则可能会发生这种情况。

我也想警告您有关Windows官方GitHub应用中的错误功能。上游不同于原点的分支将进入原点。因此,请使用命令行进行推送。

所有这些事情听起来都有些复杂。但是,如果您不想为简单而付出代价,那就总是这样。


9
我认为您绝对可以使用非付费帐户来分叉私人回购交易,并且它仍然是私人的。
豪尔赫·奥尔皮内尔2014年

1
感谢您的提示,豪尔赫。我发现这很有趣,因为我担心免费的叉子会公开。只需通过付费和非付费GitHub帐户进行验证,就可以发现您的身份。顺便说一句,即使在事实发生之后,也不能将叉子公开。
丁戈天空


2

在Bitbucket版本(Bitbucket v4.9.1)中,您可以通过以下方式限制更改:

  1. 分店名称
  2. 分支名称模式
  3. 分支名称建模

可以限制以下操作:

  1. 防止所有更改
  2. 防止删除
  3. 防止改写历史
  4. 在没有拉取请求的情况下防止更改

输入例外的用户;

在此处输入图片说明 在此处输入图片说明


0

实际上不行。Git分支在您可能以为它们之间并没有真正区别。

您在这里可能想要做的是为每个用户的开发分支使用单独的存储库。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.