60

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

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

干杯。

4

10 回答 10

53

有不止一种可能的方法来做到这一点。

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

  • 推送需要git-receive-pack在用户的 $PATH 中,并且对他们来说是可执行的......虽然我不确定这种方法有多可行。

  • 您可以使用updatepre-receive挂钩对存储库进行访问控制,例如使用git 源中的update-paranoid示例挂钩。contrib/hooks

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

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

    url.<base>.insteadOf有关从 SSH 到 GIT 协议的转换的方法,请参阅配置变量的文档。


另请参阅Scott Chacon的Pro Git书籍的第 4 章“服务器上的Git”(CC-BY-NC-SA 许可)。

于 2009-11-02T20:19:40.883 回答
13

一个pre-receive简单地打印信息性消息并以非零状态退出的钩子可以完成这项工作。

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

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

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

于 2016-10-26T00:24:26.167 回答
8
chmod -R a-w /path/to/repo.git
于 2009-11-02T16:44:03.300 回答
3

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

您可以通过将 repo 权限设置为0664用户所在的位置nobody和组类似于gitdevs. 然后,只有gitdevs组中的人才能写入 repo,但世界可以从中读取。

跟进 这里是一个链接,其中涵盖了共享您的存储库的各种方式,并涵盖了优缺点和访问控制功能。

于 2009-11-02T16:23:06.763 回答
3

受此评论的启发:

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

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

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

于 2018-11-06T07:04:34.287 回答
1

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

于 2009-11-02T16:38:37.280 回答
0

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

于 2009-11-02T16:34:55.603 回答
0

最近我使用限制对路径“/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>
于 2017-04-10T13:01:28.640 回答
0

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

  • 打开 GitLab 网络界面并转到要设置为只读的存储库
  • 选择设置 > 存储库
  • 展开受保护的分支
  • 添加master分支并将允许合并允许推送设置为
  • 如果主分支已经受到保护,您可以在下面的列表中设置这些值
于 2019-03-07T15:57:32.353 回答
0

FWIW,如果您尝试将Github 存储库设为只读,则可以将其存档:https ://docs.github.com/en/github/creating-cloning-and-archiving-repositories/archiving-a-github -repository/about-archiving-repositories

于 2021-09-02T14:53:31.133 回答