如何使git存储库成为只读?

Ste*_*lly 53 git readonly

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

这些裸存储库已初始化--shared=group,因此将所有文件的文件权限设置为660,足以保持SSH访问,但禁止写入?或者有更简单的方法吗?

干杯.

Jak*_*ski 45

有多种可能的方法可以做到这一点.

  • 如果您的每个用户都有一个shell帐户(可能是有限的),并且每个用户都通过自己的帐户访问git存储库,则可以使用文件系统权限来控制对git存储库的SSH访问.在Unix上,这些是对目录的写权限,可能是在创建组和组的特定权限的帮助下(设置了"粘性组ID").

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

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

  • 使用大量用户,您可以更好地使用工具来管理对git存储库的访问,例如Gitosis(在Python中,需要setuptools)或Gitolite(在Perl中).

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

    有关url.<base>.insteadOf简化从SSH到GIT协议的转换的方法,请参阅config变量的文档.


另请参阅Scott Chacon的第4章" Git on the Server " Pro Git书籍(CC-BY-NC-SA许可).

  • 感谢您的想法(每个人).受更新 - 偏执的示例钩子的启发,我现在在我的回购中有一个钩子,它只是为了所有推送而"回显"闭合"; 退出1` (9认同)
  • 应该注意,对于文件系统权限,您可以使用chmod,如Pat Notz所建议的那样. (2认同)
  • @SteveFolly 如果您的评论是一个答案,我会投票支持它而不是接受的答案。你的简短,中肯,并且有效。 (2认同)

Dal*_*son 10

一个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
Run Code Online (Sandbox Code Playgroud)

请记住为脚本设置可执行权限并确保由正确的用户和/或组拥有,否则它将不会执行,也不会发出任何警告.


Pat*_*otz 9

chmod -R a-w /path/to/repo.git
Run Code Online (Sandbox Code Playgroud)