如何限制Git中主分支的访问权限

124

我有一个仓库,其中包含两个用户组:

  • 管理员
  • HTML/UI开发人员

我不希望将我的master分支的读/写权限赋予HTML开发人员,因为他们不需要在上面工作,并且不应该滥用核心代码。

尽管他们需要在自己的分支ui-developers上工作。 我如何在Git上做到这一点?

P.S.:我正在使用Bitbucket


当我刚开始编码和使用Git时,我发布了这个问题。 经过两年的经验,我现在知道Git不允许限制对任何特定分支的读取访问权限。 但是像Bitbucket、GitLab和GitHub这样的服务可以让你对分支进行写入和合并限制。

此外,我在六个月前转向了GitLab :)


6
最简单的方法就是直接告诉他们你想让他们做什么。 - John Zwinck
30
@JohnZwinck希望使用“限制”而不仅仅依靠每个人遵循说明。 - Harshit Agrawal
你最终是否成功做到了这件事?我也需要做同样的事情。 - Gotts
嗨,不好意思。我无法做到这一点,因为从git上仍然不可能实现。 - Harshit Agrawal
3
你无法控制项目/组成员(在这种情况下是HTML/UI开发人员)的读取访问权限,但你肯定可以对主分支进行写入控制。你可以通过不允许提交并仅允许维护者或维护者/开发者向主分支发出合并请求来保护主分支。这样,每个开发人员都需要在必要时审查代码后才能将其合并到主分支中,而他们自己的ui-developers分支也需要进行相应的审核。 - user85
1
那么如何限制写入权限(推送)? - Abdo
6个回答

185

Git本身没有这样的功能,但许多托管服务商有。这通常被称为分支保护。据我所知,无法防止读取访问。

使用Bitbucket

Bitbucket允许大量自定义操作以通过分支保护来预防。要保护一个分支:

  1. 进入项目中的一个仓库。

  2. 选择设置分支权限

  3. 点击添加权限

  4. 分支字段中,选择分支名称分支模式分支模型

  • 分支名称 - 按名称选择现有分支。

  • 分支模式 - 使用分支模式语法指定匹配分支名称的分支。

  • 分支模型 - 选择要限制访问的分支类型。

  1. 选择要预防的操作类型。
  • 分支删除 - 防止分支和标签删除。

  • 重写历史 - 防止在指定的分支上重写历史记录 - 例如通过强制推送或变基。

  • 无需拉取请求即可更改 - 防止直接将更改推送到指定的分支;只允许使用拉取请求进行更改。

  • 所有修改 - 防止向指定的分支推送并限制创建与指定的分支或模式匹配的新分支。

  1. 可选:为任何选择的限制添加豁免。将用户或组作为豁免项添加意味着不会应用于他们。这不是必需的;不添加任何豁免意味着该限制将适用于所有人。

  • 点击Create完成。

  • 来源

    使用GitHub

    一个仓库可以有多个影响相同分支的受保护分支规则。

    在GitHub Free的公共仓库中才能使用受保护分支。

    在GitHub中,受保护分支可以进行如下配置:

    • 需要通过拉取请求并经过审查后才能合并推送,

    • 其他分支在合并前需要通过状态检查,

    • 需要签名提交,

    • 历史记录必须是线性的,

    • 即使对于管理员也要执行以上规则,

    • 只允许特定人员、团队或应用程序进行推送,

    强制推送和删除可以独立允许。

    要保护一个分支:

    1. 在GitHub上,导航到仓库的主页。

    2. 在仓库名称下,单击设置

    3. 在左侧菜单中,单击分支

    4. 在“分支保护规则”旁边,单击添加规则

    5. 在“分支名称模式”下,输入您要保护的分支名称或模式(受影响的分支会被列出并计数)。

    6. 如果需要,配置特定的分支规则设置。

    7. 单击创建保存更改

    来源

    使用GitLab

    在GitLab中,保护分支会执行以下操作:
    • 如果未被创建,则防止除具有主权限的用户之外的其他人创建该分支
    • 防止除具有主权限的用户之外的所有人推送到该分支
    • 防止任何人强制推送该分支
    • 防止任何人删除该分支
    要保护分支:
    1. 导航到项目的主页。

    2. 在右上角,点击设置按钮并选择“受保护的分支”。

    3. 从分支下拉菜单中选择要保护的分支,然后点击“保护”。

    4. 完成后,受保护的分支将出现在“已保护”的列表中。

    您可以通过选中“开发人员可以合并”或“开发人员可以推送”来允许某些开发人员权限。
    来源:链接

    GitHub的步骤似乎已经更新,自你回答以来发生了变化。请根据最新的更新更新你的回答。 - Somendra Meena
    我对Bitbucket中的“分支模型”很好奇——它似乎类似于“分支模式”,因为它允许您对所有名为“feature/”、“development”等的分支进行限制。https://confluence.atlassian.com/bitbucketserver/using-branch-permissions-776639807.html - Noumenon
    1
    GitHub 上:「受保护的分支仅适用于专业版、团队版和企业版用户」。 - Rafs
    不知道你从哪里得到那个引用,但这是 GitHub 网站上的说法:“受保护的分支在 GitHub Free 和 GitHub Free for organizations 的公共存储库中可用,在 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公共和私有存储库中也可用。” - 1615903

    7

    实际上,对于 Bitbucket,您可以添加一个仅限于主分支的分支权限来阻止所有操作:

    图片描述

    然后对于 feature,您允许对功能分支进行写入:

    图片描述

    我已经测试过了,无法直接推送到主分支。


    6
    在Git中,您可以在服务器上使用“pre-receive”挂钩来防止某些用户向分支中写入内容。使用此挂钩,您可以为推送中的每个文件应用限制策略。您可以在这里找到一个例子。

    3

    除了@1615903 的回答之外,您还可以像下面这样在Azure DevOps中保护分支:

    使用 Azure DevOps

    在 Azure DevOps 中,通过安全权限和策略来保护分支,您可以执行以下操作:

    • 添加或删除特定分支的用户和组。
    • 声明拉取请求的最少审阅者数量。
    • 自动包括代码审阅者。
    • 自动检查关联的工作项是否为必需或可选。
    • 检查评论解决方案。
    • 强制执行合并策略(不允许快进或合并)。
    • 构建验证。

    有关详细信息,请参见文档页面

    要保护分支:

    1. 在项目的主页面中选择 仓库分支 打开 分支
    2. 在显示所有分支的页面上找到您的分支。
    3. 选择 ... 按钮,然后从上下文菜单中选择 分支策略分支安全
    4. 完成后,选择 保存更改 应用新的策略配置。

    尽管我是唯一的管理员,但主分支策略页面上的所有按钮都被禁用了。 - Mike

    2
    今天这里有很多错误的信息。被保护的分支不仅限于 GitHub 的公共分支。你可以使用密钥管理(即 SSH 密钥)限制对分支的读取权限。我们经常这样做,因为我们有承包软件开发人员在我们的项目上工作,但他们并非我们公司的员工。基本上,如果你没有使用已发行的 SSH 密钥进行身份验证,你就不能访问(读/写)该分支。后来我们变得更聪明了,并开始要求每个开发人员与我们共享他们的 SSH 密钥。现在我们开发了一个脚本(适用于 Bitbucket),在授权之前检查所有 SSH 密钥。

    1
    你能再详细解释一下你是如何做到的吗? - user276648
    是哪种SSH密钥?私钥还是公钥?您能添加它吗?(但不要包含“编辑:”,“更新:”或类似的内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

    1
    对于Bitbucket,这是步骤。
    首先进入您的存储库设置。

    Enter image description here

    然后是分支权限。

    Select branch permissions

    最后,按照您的意愿进行限制。

    Set branch permissions


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