如何使一个Git仓库只读?

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

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

干杯。

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

  • 如果你的用户每个都有一个shell帐户(可能是有限的),并且他们每个人都通过自己的帐户访问git仓库,你可以使用文件系统权限来控制对git仓库的SSH访问。 在Unix上,这些对目录的写入权限可能是通过创build组的具体权限(具有“粘性组ID”)来实现的。

  • 推送需要git-receive-pack在用户的$ PATH,并为他们执行…虽然我不知道这种方法是可行的。

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

  • 随着用户数量的增加,使用工具来pipe理对git仓库的访问会更好,比如Gitosis (在Python中,需要setuptools)或者Gitolite (在Perl中)。

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

    请参阅url.<base>.insteadOf文档url.<base>.insteadOfconfigurationvariables,以便于从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>