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

时间:2009-11-02 16:13:49

标签: git readonly

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

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

干杯。

9 个答案:

答案 0 :(得分:43)

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

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

  • 推送需要 git-receive-pack 在$ PATH的用户中,并且可以为他们执行...虽然我不确定这种方法的可行性。

  • 您可以使用 updatepre-receive hook 对存储库执行访问控制,例如使用来自{{1}的update-paranoid示例挂钩在git sources中。

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

  • 对于只读访问权限,您可以设置 Gitolite 以通过contrib/hooks协议提供只读匿名(和未经身份验证的)访问,而不是通过SSH协议访问。

    请参阅git://配置变量的文档,了解如何简化从SSH到GIT协议的转换。


另见第4章。git daemonGit 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的启发:

  1. 使用以下内容更新您的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的用户(我不想在第一步中打扰管理员),所以我搜索了另一种方法,发现了一种方法:

  • 打开GitLab Web界面,然后转到要设置为只读的存储库
  • 选择设置>存储库
  • 扩展受保护的分支机构
  • 添加主分支,并将允许合并允许推送设置为没人
  • 如果master分支已经受到保护,则可以在下面的列表中设置这些值