答案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/git
mygroup
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
- 第一行创建 repo 目录
- 第二行将其组设置为
mygroup
- 第三行使用以下配置初始化一个裸仓库:
core.bare = true
:使其成为一个裸仓库core.sharedrepository = 1
(与 相同core.sharedrepository = group
):repo 目录以及之后在其中创建的所有目录都将由 git 管理,以允许mygroup
读取、写入和执行权限(同时设置 sgid 位 - 以便与非mygroup
其主要组的用户一起使用)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 使用所有初始文件和子目录的正确所有者进行初始化)。