我有一些通过SSH远程访问的Git仓库,我想将其中一些设置为只读以防止更多的推送。有些人已经在这些仓库上建立了远程指向。
这些裸仓库是使用--shared=group
初始化的,所以将所有文件的文件权限设置为660是否足以允许SSH访问但禁止写入?或者有更简单的方法吗?
谢谢。
有不止一种可能的方法来完成这个任务。
如果您的用户每个人都有一个shell帐户(可能是受限制的),并且他们每个人都通过自己的帐户访问git存储库,则可以使用文件系统权限来控制对git存储库的SSH访问。在Unix上,这些将是目录上的写入权限,可能需要创建一个组并为组设置特定权限(设置“粘性组ID”)。
推送需要用户的$PATH中有git-receive-pack
,并且对于他们来说可执行...虽然我不确定这种方法的可行性。
您可以使用update
或pre-receive
挂钩来控制对存储库的访问控制,例如使用git源中的contrib/hooks
中的update-paranoid示例挂钩。
对于较大数量的用户,最好使用工具来管理对git存储库的访问,例如Gitosis(在Python中,需要setuptools)或Gitolite(在Perl中)。
对于只读访问,您可以设置git daemon以通过git://
协议提供只读匿名(未经身份验证)访问,而不是通过SSH协议访问。
有关一种简化从SSH到GIT协议过渡的方法,请参阅url.<base>.insteadOf
配置变量的文档。
一个简单输出信息并以非零状态退出的 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
0444
。0664
,其中用户为nobody
,组为gitdevs
之类的内容,进一步进行细粒度控制。然后,只有gitdevs
组中的人才能够对repo进行写入,但世界可以从中读取。受这个评论的启发:
Update your hooks/pre-receive
file with the following content:
#!/bin/sh
echo "Closed for all pushes" ; exit 1
由于我只是我们GitLab的用户(并且一开始不想打扰管理员),因此我寻找了另一种方法并找到了一个:
最近我使用了限制访问路径“/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>
echo "Closed for all pushes" ; exit 1
。 - Steve Folly