我有一些通过SSH远程访问的git存储库,我想让它们中的一些只读,以防止更多的推送。有些人有遥控器指向这些存储库。
这些裸存储库已初始化--shared=group
,所以将所有文件的文件权限设置为660,足以保持SSH访问,但禁止写入?或者有更简单的方法吗?
干杯。
答案 0 :(得分:43)
有多种可能的方法可以做到这一点。
如果您的用户各自拥有一个shell帐户(可能有限),并且每个帐户都通过自己的帐户访问git存储库,则可以使用文件系统权限来控制对git存储库的SSH访问。在Unix上,这些是对目录的写权限,可能是在创建组和组的特定权限的帮助下(设置了“粘性组ID”)。
推送需要 git-receive-pack
在$ PATH的用户中,并且可以为他们执行...虽然我不确定这种方法的可行性。
您可以使用 update
或pre-receive
hook 对存储库执行访问控制,例如使用来自{{1}的update-paranoid示例挂钩在git sources中。
使用工具来管理对git存储库的访问,可以更好地使用大量用户,例如Gitosis(在Python中,需要setuptools)或{{3 (在Perl中)。
对于只读访问权限,您可以设置 Gitolite 以通过contrib/hooks
协议提供只读匿名(和未经身份验证的)访问,而不是通过SSH协议访问。
请参阅git://
配置变量的文档,了解如何简化从SSH到GIT协议的转换。
另见第4章。git daemon“Git on the Server”作者:Scott Chacon(CC-BY-NC-SA获得许可)。
答案 1 :(得分:10)
只需打印信息性消息的pre-receive
挂钩,以及非零状态退出即可完成工作。
假设您在邮件中添加了一些有意义的信息,它还会减少来自沮丧用户的查询,询问他们为什么无法推送:
#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1
请记住为脚本设置可执行权限并确保由正确的用户和/或组拥有,否则它将不会执行,也不会发出任何警告。
答案 2 :(得分:9)
chmod -R a-w /path/to/repo.git
答案 3 :(得分:3)
由于git主要依赖文件系统进行访问控制,因此可行。请注意,在您的权限中,全世界无权访问该文件,但该用户和组具有读/写访问权限。如果您想要世界可读,您的权限应为0444
。
您可以将repo权限设置为0664
,其中用户为nobody
且该组类似于gitdevs
,您可以进行进一步的细粒度控制。然后,只有gitdevs
组中的人才能够写入回购,但世界可以从中读取。
跟进 Here is a link,其中包含各种方式来分享您的回购和封面,专业版和专业版缺点和访问控制功能。
答案 4 :(得分:2)
受this comment的启发:
使用以下内容更新您的hooks/pre-receive
文件:
#!/bin/sh
echo "Closed for all pushes" ; exit 1
这样,所有尝试将更改推送到此仓库的用户都会收到上面的消息,而推送将被拒绝。
答案 5 :(得分:1)
如果您还需要访问控制,请查看gitosis。设置起来非常简单,您可以使用简单的脚本来控制谁可以做什么。
答案 6 :(得分:0)
另一种可能性是git协议,但它需要git守护程序运行。
答案 7 :(得分:0)
最近,我使用限制访问路径“/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>
答案 8 :(得分:0)
由于我只是GitLab的用户(我不想在第一步中打扰管理员),所以我搜索了另一种方法,发现了一种方法: