Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使git存储库成为只读的?_Git_Readonly - Fatal编程技术网

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

如何使git存储库成为只读的?,git,readonly,Git,Readonly,我有一些通过SSH远程访问的git存储库,我想让其中一些存储库成为只读的,以防止更多的推送。有些人有指向这些存储库的遥控器 这些裸存储库是初始化的--shared=group,所以将所有文件的文件权限设置为660是否足以允许SSH访问,但不允许写入?还是有更简单的方法 干杯。既然git主要依靠文件系统进行访问控制,那就行了。请注意,在您的权限中,世界无权访问该文件,但用户和组具有读/写权限。如果您希望世界可读,您的权限应该是0444 您可以通过将repo权限设置为0664来进行进一步的细粒度控制

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

这些裸存储库是初始化的
--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
    pre-receive
    hook
    对存储库进行访问控制,例如在git源代码中使用
    contrib/hooks
    中的示例hook

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

  • 对于只读访问,您可以设置通过
    git://
    协议提供只读匿名(未经验证)访问,而不是通过SSH协议进行访问

    请参阅
    url..而不是
    config变量的文档,了解简化从SSH到GIT协议转换的方法



另见第4章。“Scott Chacon的著作(CC-by-NC-SA许可)。

pre-receive
hook只需打印一条信息性消息并以非零状态退出即可完成此任务

假设您在邮件中添加了一些有意义的信息,它还可以减少沮丧用户询问他们为什么不能推送的查询:

#!/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并转到要设置为只读的存储库
    • 选择设置>存储库
    • 展开受保护的分支
    • 添加主分支并设置允许合并允许推送无人
    • 如果主分支已受保护,则可以在下面的列表中设置这些值

    666是世界可读写文件。776是世界和组可读、可写和可执行的,其他用户可以读和写。不知道你从哪里得到你推荐的数字,但它们通常是危险的。谢谢,更正了我的答案。输入太多,思考不够。应该注意,对于文件系统权限,您可以按照Pat Notz的建议使用chmod。谢谢大家的建议。受更新偏执狂示例钩子的启发,我现在在我的repos中有了一个钩子,
    echo“关闭所有推送”;退出1
    @SteveFolly如果你的评论是答案,我会投赞成票,而不是接受答案。你的答案很简短,切中要害,很有效。@Klabourn我根据Steven的评论添加了一个正确的答案。这是否可能与GitHub Enterprise有关,而不需要配置整个实例,这意味着组织/回购所有者可以这样做?似乎实际服务器的管理员需要根据本文档为您提供帮助:“将其中一些设置为只读以防止更多推送”—这将防止拉拽,不是吗?谢谢。这对我有用。顺便说一下,值得一提的是hooks目录位于存储库根文件系统路径下。