如何使git存储库成为只读的?
我有一些通过SSH远程访问的git存储库,我想让其中一些存储库成为只读的,以防止更多的推送。有些人有指向这些存储库的遥控器 这些裸存储库是初始化的如何使git存储库成为只读的?,git,readonly,Git,Readonly,我有一些通过SSH远程访问的git存储库,我想让其中一些存储库成为只读的,以防止更多的推送。有些人有指向这些存储库的遥控器 这些裸存储库是初始化的--shared=group,所以将所有文件的文件权限设置为660是否足以允许SSH访问,但不允许写入?还是有更简单的方法 干杯。既然git主要依靠文件系统进行访问控制,那就行了。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写权限。如果您希望世界可读,您的权限应该是0444 您可以通过将repo权限设置为0664来进行进一步的细粒度控制
--shared=group
,所以将所有文件的文件权限设置为660是否足以允许SSH访问,但不允许写入?还是有更简单的方法
干杯。既然git主要依靠文件系统进行访问控制,那就行了。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写权限。如果您希望世界可读,您的权限应该是
0444
您可以通过将repo权限设置为0664
来进行进一步的细粒度控制,其中用户是nobody
,组类似于gitdevs
。然后,只有gitdevs
组中的人才能写入回购协议,但全世界都可以从中读取
后续介绍了共享回购协议的各种方式,并介绍了come pro&cons和访问控制功能。另一种可能是git协议,但它需要git守护进程运行。如果您还需要访问控制,请查看。设置非常简单,您可以使用一个简单的脚本来控制谁可以做什么。有多种可能的方法
chmod -R a-w /path/to/repo.git
- 如果您的每个用户都有一个shell帐户(可能是有限的),并且每个用户都通过自己的帐户访问git存储库,那么您可以使用文件系统权限来控制对git存储库的SSH访问。在Unix上,这些将是对目录的写入权限,可能需要帮助创建组和组的特定权限(设置了“sticky group ID”)
- 推送要求git receive pack位于用户的$PATH中,并且对他们来说是可执行的。。。虽然我不确定这种方法是否可行
- 您可以使用
或update
hook对存储库进行访问控制,例如在git源代码中使用pre-receive
中的示例hookcontrib/hooks
- 对于更多的用户,您可以更好地使用工具来管理对git存储库的访问,如(在Python中,需要setuptools)或(在Perl中)
- 对于只读访问,您可以设置通过
协议提供只读匿名(未经验证)访问,而不是通过SSH协议进行访问 请参阅git://
url..而不是
config变量的文档,了解简化从SSH到GIT协议转换的方法
另见第4章。“Scott Chacon的著作(CC-by-NC-SA许可)。pre-receivehook只需打印一条信息性消息并以非零状态退出即可完成此任务 假设您在邮件中添加了一些有意义的信息,它还可以减少沮丧用户询问他们为什么不能推送的查询:
#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1
请记住为脚本设置可执行权限,并确保它由正确的用户和/或组拥有,否则它将不会执行,也不会发出任何警告。最近,我使用限制对路径“/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>
要求集团开发人员
需要组开发人员
灵感来自:
hooks/pre-receive
文件:
#!/bin/sh
echo "Closed for all pushes" ; exit 1
这样,所有试图将更改推送到该repo的用户都将收到上述消息,推送将被拒绝。由于我只是我们GitLab的用户(我不想在第一步打扰管理员),我搜索了另一种方法并找到了一种:
- 打开GitLab webinterface并转到要设置为只读的存储库
- 选择设置>存储库
- 展开受保护的分支
- 添加主分支并设置允许合并和允许推送至无人
- 如果主分支已受保护,则可以在下面的列表中设置这些值
echo“关闭所有推送”;退出1
@SteveFolly如果你的评论是答案,我会投赞成票,而不是接受答案。你的答案很简短,切中要害,很有效。@Klabourn我根据Steven的评论添加了一个正确的答案。这是否可能与GitHub Enterprise有关,而不需要配置整个实例,这意味着组织/回购所有者可以这样做?似乎实际服务器的管理员需要根据本文档为您提供帮助:“将其中一些设置为只读以防止更多推送”—这将防止拉拽,不是吗?谢谢。这对我有用。顺便说一下,值得一提的是hooks目录位于存储库根文件系统路径下。