标准解决方案

标准解决方案

我在临时服务器上有一个 Git 存储库,多个开发人员需要能够将其拉取到。git-init似乎有一个非常接近我所寻找的标志:--shared,但我希望多个人也能拉取到该存储库。git-clone--shared旗帜所起的作用却完全不同。

更改现有存储库权限的最简单方法是什么?

答案1

权限是个麻烦事。

基本上,您需要确保所有这些开发人员都可以写入 git repo 中的所有内容。

跳至新浪潮解决方案,了解授予一组开发人员写入能力的更优越的方法。

标准解决方案

如果将所有开发人员放入一个专门创建的组中,原则上您可以这样做:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

然后将umask用户的更改为002,以便创建具有组可写权限的新文件。

这个问题很多;如果你使用的发行版假设了某些umask权限022(例如,users默认情况下有一个包含所有人的公共组),这可能会在其他地方引发安全问题。迟早,某些东西会破坏你精心设计的权限方案,使存储库无法运行,直到你获得root访问权限并修复它(即重新运行上述命令)。

新浪潮解决方案

一个更好的解决方案是使用 POSIX 扩展属性,尽管它不太为人所知,并且需要更多的操作系统/工具支持。我最近才涉足这个领域,所以我在这方面的知识并不那么丰富。但基本上,扩展 ACL 能够设置 3 个默认槽位(用户/组/其他)以外的权限。

因此再次创建你的组,然后运行:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

这将为组设置扩展 ACL,以便组成员可以读取/写入/访问已存在的任何文件(第一行);然后,还告诉所有现有目录,新文件应该应用相同的 ACL(第二行)。

希望这能帮助你顺利前行。

答案2

如果你使用以下方式创建了存储库(或者从现有存储库克隆了一个新的裸存储库)

$ git init --shared=group 

或者

$ git init --shared=0NNN

Git 应该处理超出默认 umask 所提供的权限。最后,这在我的 Git 版本 (1.6.3) 上是正确的。当然,这假设您的用户属于同一组。

但是,如果我需要管理多个组中具有不同程度的读/写权限的用户,我会选择 gitosis。我也听说过 gitolite (http://github.com/sitaramc/gitolite),一个 gitosis fork,应该提供分支级别的权限,但我不能说我曾经亲自使用过它。

答案3

这个还没说过,所以我想赶紧补充一下。

为了确保权限问题不会出现,请确保在 git 共享存储库的配置文件中设置以下内容:

[core]
    sharedRepository = true

这将确保您的系统的“umask”设置受到尊重。

答案4

汇总来自其他各种答案和评论的关于设置新 repo 的一些好的建议:

如果你正在为该组myrepo建立一个全新的 repo ,那么这就是你想要的:/srv/gitmygroup

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. 第一行创建 repo 目录
  2. 第二行将其组设置为mygroup
  3. 第三行使用以下配置初始化一个裸仓库:
    1. core.bare = true:使其成为一个裸仓库
    2. core.sharedrepository = 1(与 相同core.sharedrepository = group):repo 目录以及之后在其中创建的所有目录都将由 git 管理,以允许mygroup读取、写入和执行权限(同时设置 sgid 位 - 以便与非mygroup其主要组的用户一起使用)
    3. receive.denyNonFastforwards = 1:拒绝对 repo 进行非快进推送

如果要微调用户、组或其他用户的权限,请使用--shared=0NNN,其中NNN标准用户、组和其他位是文件(执行和 sgid 位目录将由 git 进行适当管理)。例如,这允许用户进行读写访问,并允许组进行只读访问(而不允许其他用户访问):

git init --bare --shared=0640 /srv/git/myrepo.git

这允许用户和组进行读写访问(而不允许其他人访问):

git init --bare --shared=0660 /srv/git/myrepo.git

这允许用户和组进行读写访问,并允许其他用户进行只读访问:

git init --bare --shared=0664 /srv/git/myrepo.git

请注意,如果您不允许对该组进行写访问,请确保首先使用chown设置 repo 的所有者,然后git init以该用户的身份运行该命令(以确保 repo 使用所有初始文件和子目录的正确所有者进行初始化)。

相关内容