我有一些通过 SSH 远程访问的 git 存储库,我想将其中一些设置为只读以防止更多推送。有些人有指向这些存储库的遥控器。
这些裸存储库已初始化--shared=group
,因此将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问,但不允许写入?或者有没有更简单的方法?
干杯。
有不止一种可能的方法来做到这一点。
如果您的用户每个都有一个 shell 帐户(可能是有限的),并且他们每个人都通过自己的帐户访问 git 存储库,那么您可以使用文件系统权限来控制对 git 存储库的 SSH 访问。在 Unix 上,那些将是对目录的写权限,也许是在创建组和组的特定权限的帮助下(设置了“粘性组 ID”)。
推送需要git-receive-pack
在用户的 $PATH 中,并且对他们来说是可执行的......虽然我不确定这种方法有多可行。
您可以使用update
或pre-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 许可)。
一个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,但世界可以从中读取。
跟进 这里是一个链接,其中涵盖了共享您的存储库的各种方式,并涵盖了优缺点和访问控制功能。
受此评论的启发:
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