如何使一个Git仓库只读?
我有一些通过SSH远程访问的git仓库,我想让其中一些只读,以防止更多的推动。 有些人有遥控器指向这些存储库。
这些裸存储库初始化--shared=group
,所以是设置文件权限为660所有文件足够好,仍然允许SSH访问,但不允许写入? 还是有更简单的方法?
干杯。
有不止一种可能的方法来做到这一点。
-
如果你的用户每个都有一个shell帐户(可能是有限的),并且他们每个人都通过自己的帐户访问git仓库,你可以使用文件系统权限来控制对git仓库的SSH访问。 在Unix上,这些对目录的写入权限可能是通过创build组的具体权限(具有“粘性组ID”)来实现的。
-
推送需要
git-receive-pack
在用户的$ PATH,并为他们执行…虽然我不知道这种方法是可行的。 -
您可以使用
update
或pre-receive
挂钩来对存储库进行访问控制,例如使用来自git来源中的contrib/hooks
update-paranoid示例钩子。 -
随着用户数量的增加,使用工具来pipe理对git仓库的访问会更好,比如Gitosis (在Python中,需要setuptools)或者Gitolite (在Perl中)。
-
对于只读访问,您可以设置git守护进程 ,通过
git://
协议提供只读匿名(而不是经过身份validation的)访问,而不是通过SSH协议访问。请参阅
url.<base>.insteadOf
文档url.<base>.insteadOf
configurationvariables,以便于从SSH过渡到GIT协议。
另见Scott Chacon(CC-BY-NC-SA许可)的Pro Git书籍的第4章“ 服务器上的 Git ”。
chmod -R aw /path/to/repo.git
一个pre-receive
钩子,只是打印一个信息性的消息,并退出非零状态做的工作。
假设你在消息中join了一些有意义的信息,它也减less了受挫用户询问他们为什么不能推送的查询:
#!/bin/bash echo "==================================================" echo "This repository is no longer available for pushes." echo "Please visit blah blah yadda yadda ...." echo "==================================================" exit 1
由于git主要依靠文件系统进行访问控制,所以这将起作用。 请注意,在您的权限中,世界无权访问文件,但用户和组具有读/写权限。 如果你想世界可读,你的权限应该是0444
。
你可以做更进一步的细粒度的控制,通过设置回购权限为0664
,其中用户是nobody
,组是像gitdevs
。 那么,只有gitdevs
集团的gitdevs
能够写回购,但世界可以从中读取。
跟进 这里是一个链接 ,涵盖了各种方式来分享您的回购,并涵盖来临的利弊和访问控制function。
如果您还需要访问控制,请检查gitosis 。 很容易设置,你可以使用一个简单的脚本来控制谁可以做什么。
另一种可能是git协议,但是它需要git守护进程运行。
最近,我使用限制访问path“/repo.git/git-receive-pack”来达到这样的结果:对于某些用户来说,这个版本库是可读写的,对其他版本来说是只读的。 在httpdconfiguration它看起来像这样:
<Location /repo.git/> Require group developers developers-ro </Location> <Location /repo.git/git-receive-pack> Require group developers </Location>