2009-11-02 57 views
39

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

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

干杯。

回答

39

有多种可能的方式来做到这一点。

  • 如果您的用户都有一个shell账号(也许是有限的),他们每个人通过自己的帐户访问git代码库,你可以使用文件系统权限控制到Git仓库SSH访问。在Unix上,这些将在目录上写入权限,可能在创建组的组和特定权限的帮助下(使用“粘性组ID”设置)。

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

  • 您可以使用updatepre-receive做访问控制库,例如在git的来源使用update-paranoid例如钩从contrib/hooks

  • 有了更大的用户数,你可以与使用工具来管理访问的git仓库,像Gitosis(Python中,需要setuptools的)或Gitolite(Perl中)更好。

  • 对于只读访问可以设置git daemon提供只读经由SSH协议通过git://协议匿名(和未)访问,而不是访问。

    对于一种方式,以减轻从SSH到GIT协议过渡url.<base>.insteadOf配置变量见文档。


参见第4章 “Git on the ServerPro Git书由斯科特·查孔(CC-BY-NC-SA许可)。

+2

应该注意,对于文件系统权限,您可以使用chmod,正如Pat Notz所建议的那样。 – 2009-11-04 16:13:23

+8

感谢您的想法(每个人)。受到更新偏执狂示例钩子的启发,我现在在我的回购站中有一个钩子,它简单地“echo”关闭所有按钮“;退出1' – 2009-11-12 21:30:03

+1

@SteveFolly如果你的评论是一个答案,我会投它而不是接受的答案。你的论文短小,重点突出,有效。 – 2015-04-28 06:56:04

3

因为git主要依赖文件系统进行访问控制,所以这将起作用。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写访问权限。如果你想世界可读,你的权限应该是0444

您可以通过将回购权限设置为0664(其中用户为nobody且该组类似于gitdevs)来做更进一步的细粒度控制。然后,只有gitdevs组中的人才能够写回购,但世界可以从中读取。

后续Here is a link,涵盖各种方式来分享你的回购和封面来亲的&利弊和访问控制功能。

+0

666是世界上可读写的文件。 776是世界和群体可读,可写和可执行的,其他用户可以读写。不知道你在哪里得到你推荐的号码,但他们通常是危险的。 – Dustin 2009-11-02 22:50:32

+0

谢谢,纠正了我的答案。打字太多,思维不够。 – jheddings 2009-11-02 22:58:44

0

另一种可能性是git协议,但它需要git守护进程运行。

1

如果您还需要访问控制,请查看gitosis。很容易设置,你可以使用一个简单的脚本来控制谁可以做什么。

+1

或gitolite:http://github.com/sitaramc/gitolite – 2009-11-02 19:48:21

9
chmod -R a-w /path/to/repo.git 
+0

“使其中一些只读,以防止更多推动” - 这将防止拉,不是吗? – user3175580 2017-10-11 07:30:33

7

一个pre-receive挂钩,简单的打印通知消息,退出与非0状态做这项工作。

假设你把一些有意义的信息,在你的消息,这也减少了从失望的用户,询问他们为什么不能把查询:

#!/bin/bash 
echo "==================================================" 
echo "This repository is no longer available for pushes." 
echo "Please visit blah blah yadda yadda ...." 
echo "==================================================" 
exit 1 
0

最近我用限制访问路径“/回购。 git/git-receive-pack“来存档结果,该存储库对于某些用户来说是可读写的,而对于其他用户则是只读的。在httpd配置中,它看起来像这样:

<Location /repo.git/> 
      Require group developers developers-ro 
    </Location> 

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location>