【发布时间】:2010-12-12 08:14:13
【问题描述】:
我有一些通过 SSH 远程访问的 git 存储库,我想将其中一些设置为只读以防止更多推送。有些人有指向这些存储库的遥控器。
这些裸存储库已初始化--shared=group,因此将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问,但不允许写入?还是有更简单的方法?
干杯。
【问题讨论】:
我有一些通过 SSH 远程访问的 git 存储库,我想将其中一些设置为只读以防止更多推送。有些人有指向这些存储库的遥控器。
这些裸存储库已初始化--shared=group,因此将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问,但不允许写入?还是有更简单的方法?
干杯。
【问题讨论】:
有不止一种方法可以做到这一点。
如果您的用户每个都有一个 shell 帐户(可能是有限的),并且每个人都通过自己的帐户访问 git 存储库,那么您可以使用 文件系统权限 来控制对 git 存储库的 SSH 访问。在 Unix 上,这些将是对 目录 的写入权限,可能需要创建组和组的特定权限(设置“粘性组 ID”)。
推送需要 git-receive-pack 位于用户的 $PATH 中,并且可以为他们执行...虽然我不确定这种方法的可行性。
您可以使用 update 或 pre-receive 钩子 对存储库进行访问控制,例如在 git 源中使用来自 contrib/hooks 的 update-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 许可)。
【讨论】:
echo "Closed for all pushes" ; exit 1
pre-receive 钩子只是打印一条信息性消息并以非零状态退出即可完成这项工作。
假设您在消息中添加了一些有意义的信息,它也会减少沮丧的用户询问他们为什么不能推送的查询:
#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1
记得为脚本设置可执行权限,并确保由正确的用户和/或组拥有,否则它将不会执行并且不会给出任何警告。
【讨论】:
chmod -R a-w /path/to/repo.git
【讨论】:
由于 git 主要依赖于文件系统进行访问控制,因此它会起作用。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写权限。如果你想要全世界可读,你的权限应该是0444。
您可以通过将 repo 权限设置为 0664 来进行更细粒度的控制,其中用户是 nobody,组类似于 gitdevs。然后,只有 gitdevs 组中的人才能写入 repo,但全世界都可以从中读取。
跟进 Here is a link 涵盖了分享您的存储库的各种方式,并涵盖了优缺点和访问控制功能。
【讨论】:
灵感来自this comment:
使用以下内容更新您的 hooks/pre-receive 文件:
#!/bin/sh
echo "Closed for all pushes" ; exit 1
这样一来,所有尝试向这个 repo 推送更改的用户都将收到上述消息,并且推送将被拒绝。
【讨论】:
如果您还需要访问控制,请查看gitosis。设置非常简单,您可以使用一个简单的脚本来控制谁可以做什么。
【讨论】:
另一种可能是 git 协议,但它需要运行 git 守护进程。
【讨论】:
最近我使用限制对路径“/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>
【讨论】:
由于我只是我们 GitLab 的用户(而且我不想在第一步中打扰管理员),我搜索了另一种方法并找到了一个:
【讨论】:
FWIW,如果您尝试将 Github 存储库设为只读,您可以将其归档:https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/archiving-a-github-repository/about-archiving-repositories
【讨论】: