【问题标题】:A way to restrict Git branch access?一种限制 Git 分支访问的方法?
【发布时间】:2012-02-05 13:32:12
【问题描述】:

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

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

有没有办法限制对单个分支([人名]-开发)的写访问?我该怎么做?

作为参考,类似的问题:How to write a git hook to restrict writing to branch?

【问题讨论】:

标签: git github


【解决方案1】:

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

  1. 分公司名称
  2. 分支名称模式
  3. 分支名称建模

可以限制以下操作:

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

输入例外的用户;

【讨论】:

    【解决方案2】:

    如果您使用 bitbucket - 有处理它的分支权限。 https://confluence.atlassian.com/bitbucket/branch-permissions-385912271.html

    【讨论】:

      【解决方案3】:

      GitHub 将功能添加到 restrict which users can push to a branch 之前的组织 this year

      【讨论】:

        【解决方案4】:

        注意:Protected branches and required status checks(2015 年 9 月 3 日)不会完全允许单个分支(“[person's name]-development”),但它会被克隆。

        分支将被保护:

        • 反对强推
        • 反对删除
        • 在所需的状态检查通过之前反对合并更改

        【讨论】:

        • 应该可以添加一个“检查”,基本上检查提交是否来自授权用户。您可能无法根据提交本身来确定这一点(因为任何人都可以伪造电子邮件),但您可以拥有一个应用程序,授权用户可以在推送之前将提交哈希列入白名单。
        • 另一种选择:制作一个允许审核传入推送的应用,如果在特定时间段内没有人授权确认,则自动拒绝它们。
        • @interestinglythere 您的第一条评论是 gitolite 所涵盖的内容(gitolite.com/gitolite/gitolite.html#overview, stackoverflow.com/a/10888358/6309
        • Gitolite 是一个 git 托管系统;它旨在取代像 GitHub 这样的服务。它可以处理权限,但仅限于它托管的 git 存储库。因此它不能用于维护 GitHub 上的推送访问控制。
        • @interestinglythere 我同意。我只是提到了与“授权”功能有关的 gitolite,而不是与 GitHub 的关系。
        【解决方案5】:

        与 GitLab 一样,BitBucket.org 也有分支限制功能。

        http://blog.bitbucket.org/2013/09/16/take-control-with-branch-restrictions/

        【讨论】:

          【解决方案6】:

          您可能想查看 GitLab 及其“受保护分支”功能。我认为这正是您正在寻找的。见Keeping your code protected

          【讨论】:

            【解决方案7】:

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

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

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

            针对开发人员的设置非常简单明了: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 repos。

            VonC 还建议分叉 production 存储库并向其发出拉取请求 - 为什么不这样做? 首先,因为你不能在没有支付 GitHub 的情况下分叉私人存储库帐户。其次,要允许某人分叉 private 存储库,您可以让他完全访问它,这样他就可以直接推送它。开发人员可能会犯错,推送到production repo 启动 GitHub 服务挂钩并搞砸事情。如果您使用多个外包开发人员,则很可能会发生这种情况。

            另外,我想警告您有关 Windows 官方 GitHub 应用程序中的 错误 功能。上游与原点不同的分支将进入原点。所以使用命令行推送。

            所有这些事情听起来有点过于复杂。但是,如果您不想为简单而付费,那总是这样。

            【讨论】:

            • 我认为你绝对可以用非付费帐户分叉一个私人回购,它仍然是私人的。
            • 感谢您的建议,豪尔赫。我觉得这很有趣,因为我担心无偿分叉会公开。只需通过付费和非付费 GitHub 帐户进行验证,您就可以在现场。顺便说一句,即使事后也不能公开分叉。
            【解决方案8】:

            使用 GitHub 时,您最好的选择是让每个开发人员都拥有自己的主存储库分支。每个人都推送到他们自己的存储库,并且具有对主存储库的推送访问权限的人处理从每个开发人员的存储库中提取。这是大多数开源项目的工作方式。

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

            【讨论】:

            【解决方案9】:

            实际上没有。 Git 分支并没有像您想象的那样彼此真正不同。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-12-16
              • 2015-07-02
              • 2014-06-27
              • 2012-11-09
              • 2012-10-17
              • 2020-04-16
              • 2016-03-23
              • 1970-01-01
              相关资源
              最近更新 更多