【问题标题】:How to make a git repository read-only?如何使 git 存储库只读?
【发布时间】:2010-12-12 08:14:13
【问题描述】:

我有一些通过 SSH 远程访问的 git 存储库,我想将其中一些设置为只读以防止更多推送。有些人有指向这些存储库的遥控器。

这些裸存储库已初始化--shared=group,因此将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问,但不允许写入?还是有更简单的方法?

干杯。

【问题讨论】:

    标签: git readonly


    【解决方案1】:

    有不止一种方法可以做到这一点。

    • 如果您的用户每个都有一个 shell 帐户(可能是有限的),并且每个人都通过自己的帐户访问 git 存储库,那么您可以使用 文件系统权限 来控制对 git 存储库的 SSH 访问。在 Unix 上,这些将是对 目录 的写入权限,可能需要创建组和组的特定权限(设置“粘性组 ID”)。

    • 推送需要 git-receive-pack 位于用户的 $PATH 中,并且可以为他们执行...虽然我不确定这种方法的可行性。

    • 您可以使用 updatepre-receive 钩子 对存储库进行访问控制,例如在 git 源中使用来自 contrib/hooksupdate-paranoid 示例钩子。

    • 如果用户数量较多,您最好使用 工具来管理对 git 存储库的访问,例如 Gitosis(在 Python 中,需要 setuptools)或 Gitolite(在 Perl 中)。

    • 对于只读访问,您可以设置 git daemon 以通过 git:// 协议提供只读匿名(和未经身份验证)访问,而不是通过 SSH 协议访问。

      请参阅url.<base>.insteadOf 配置变量的文档,了解如何简化从 SSH 到 GIT 协议的转换。


    另见第 4 章。Pro Git 的“Git on the Server”,Scott Chacon 所著(CC-BY-NC-SA 许可)。

    【讨论】:

    • 应该注意,对于文件系统权限,您可以使用 chmod,正如 Pat Notz 所建议的那样。
    • 感谢您的想法(大家)。受 update-paranoid 示例钩子的启发,我现在在我的 repos 中有一个钩子,它只是做echo "Closed for all pushes" ; exit 1
    • @SteveFolly 如果您的评论是一个答案,我会投票给它而不是接受的答案。您的文章简短、中肯、有效。
    • @KlasMellbourn 我根据史蒂夫的评论添加了一个正确的答案。
    • 这是否可以与 GitHub Enterprise 一起完成,而无需访问配置整个实例,这意味着 org/repo 所有者可以做到这一点?看起来实际服务器的管理员需要根据本文档为您提供帮助:help.github.com/en/enterprise/2.18/admin/developer-workflow/…
    【解决方案2】:

    pre-receive 钩子只是打印一条信息性消息并以非零状态退出即可完成这项工作。

    假设您在消息中添加了一些有意义的信息,它也会减少沮丧的用户询问他们为什么不能推送的查询:

    #!/bin/bash
    echo "=================================================="
    echo "This repository is no longer available for pushes."
    echo "Please visit blah blah yadda yadda ...."
    echo "=================================================="
    exit 1
    

    记得为脚本设置可执行权限,并确保由正确的用户和/或组拥有,否则它将不会执行并且不会给出任何警告。

    【讨论】:

      【解决方案3】:
      chmod -R a-w /path/to/repo.git
      

      【讨论】:

      • “将它们中的一些设为只读以防止更多推送”——这样可以防止拉取,不是吗?
      【解决方案4】:

      由于 git 主要依赖于文件系统进行访问控制,因此它会起作用。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写权限。如果你想要全世界可读,你的权限应该是0444

      您可以通过将 repo 权限设置为 0664 来进行更细粒度的控制,其中用户是 nobody,组类似于 gitdevs。然后,只有 gitdevs 组中的人才能写入 repo,但全世界都可以从中读取。

      跟进 Here is a link 涵盖了分享您的存储库的各种方式,并涵盖了优缺点和访问控制功能。

      【讨论】:

      • 666 是世界可读可写文件。 776 是世界和组可读、可写、可执行和其他用户可读写的。不确定您推荐的号码是从哪里得到的,但它们通常很危险。
      • 谢谢,更正了我的回答。打字太多,思考不够。
      【解决方案5】:

      灵感来自this comment:

      1. 使用以下内容更新您的 hooks/pre-receive 文件:

        #!/bin/sh
        
        echo "Closed for all pushes" ; exit 1
        

      这样一来,所有尝试向这个 repo 推送更改的用户都将收到上述消息,并且推送将被拒绝。

      【讨论】:

      • 谢谢。这对我有用。顺便提一下,hooks 目录位于存储库根文件系统路径下。
      【解决方案6】:

      如果您还需要访问控制,请查看gitosis。设置非常简单,您可以使用一个简单的脚本来控制谁可以做什么。

      【讨论】:

        【解决方案7】:

        另一种可能是 git 协议,但它需要运行 git 守护进程。

        【讨论】:

          【解决方案8】:

          最近我使用限制对路径“/repo.git/git-receive-pack”的访问来实现存储库对某些用户是读写的,而对其他一些用户是只读的。在 httpd 配置中它看起来像这样:

              <Location /repo.git/>
                      Require group developers developers-ro
              </Location>
          
              <Location /repo.git/git-receive-pack>
                      Require group developers
              </Location>
          

          【讨论】:

            【解决方案9】:

            由于我只是我们 GitLab 的用户(而且我不想在第一步中打扰管理员),我搜索了另一种方法并找到了一个:

            • 打开 GitLab 网络界面并转到要设置为只读的存储库
            • 选择 设置 > 存储库
            • 展开受保护的分支
            • 添加master分支并将允许合并允许推送设置为无人
            • 如果 master 分支已经受到保护,您可以在下面的列表中设置这些值

            【讨论】:

              【解决方案10】:

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-08-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-23
                相关资源
                最近更新 更多