Answers:
许可是一种害虫。
基本上,您需要确保所有这些开发人员都可以写入git repo中的所有内容。
跳至“新波解决方案”以获取授予一组开发人员写功能的高级方法。
如果将所有开发人员放在一个专门创建的小组中,原则上可以做到:
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
然后umask
将用户的更改为002
,以便使用组可写权限创建新文件。
问题在于大军。如果您所使用的发行版采用umask
的022
(例如users
,默认情况下每个人都有一个公共组),那么这可能会在其他地方引发安全问题。迟早会有一些事情搞砸您精心设计的权限方案,使存储库不起作用,直到您可以root
访问并对其进行修复(即,重新运行以上命令)。
上乘的解决方案(虽然尚不为人所理解,并且需要更多的OS /工具支持)是使用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(第二行)。
希望能带您上路。
chmod -R g+swX
,它使Git非常不高兴,并决定它不再是git存储库(“ repo似乎不是git存储库”)。我不得不修改所有文件。要仅在目录上设置setgid位,请尝试find /path/to/repo -type d -print0 | xargs -0 chmod g+s
。仍然做chgrp -R thegroup /path/to/repo
。
chmod -R g+swX gitrepo
将setguid位应用于文件,这是安全隐患。相反,您可以用来find . -type d -exec chmod g+s {} +
仅将其应用于目录。
如果您使用以下命令创建了存储库(或从现有存储库中克隆了一个新的裸存储库)
$ git init --shared=group
要么
$ git init --shared=0NNN
Git应该能够处理超出默认umask所提供权限之外的权限。最后,在我的Git版本(1.6.3)中,这是正确的。当然,这假定您的用户在同一组中。
但是,如果我需要以不同程度的读/写来管理多个组中的用户,那么我会使用gitosis。我也听说过有人提到过gitolite(http://github.com/sitaramc/gitolite),这是一个可以提供分支级别权限的gitosis分支,但不能说我每个人都亲自使用过它。
--shared
参数采用八进制而不是十六进制。我已经在Git 1.7.8的源代码中确认了这一点,第二个示例应该是git init --shared=0NNN
。
NNN
权限掩码或组号或其他内容?
git init --bare --shared=group myproj
myproj是您的存储库名称,然后是chgrp -R mygroup myproj
mygroup是您的组名称。
这还没有说,所以我想快速添加它。
为了确保权限问题不会变得丑陋,请确保在git共享存储库的配置文件中设置以下内容:
[core]
sharedRepository = true
这将确保遵守系统的“ umask”设置。
git config core.sharedRepository true
。
git init --shared
是git clone --config core.sharedRepository=true
。git奇怪,--shared
在类似的命令中用于不同的含义。
尽管功能齐全,但是共享存储库的方法更为复杂:
我们将GitHub用于由6个开发人员组成的团队。
修复共享存储库中的权限(使用户在推送时不会出现权限问题)的一种方法是创建一个更新后的钩子脚本即可。这应该可以在任何git版本中使用。
假设您在/myrepo.git中有一个共享存储库。该存储库中的所有文件都属于mysharedgroup。推送到该存储库的所有用户也应属于mysharedgroup。现在创建以下文件(将mysharedgroup更改为您的首选项):
/myrepo.git/hooks/post-update
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
/dev/null
。请先让用户看到这些消息,然后再自行决定。
要汇总其他各种关于建立新仓库的答案和评论中的一些好建议,请执行以下操作:
如果你正在建立一个全新的回购myrepo
在/srv/git
该组mygroup
,这是你想要什么:
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
mygroup
core.bare = true
:使其成为裸露的仓库core.sharedrepository = 1
(与相同core.sharedrepository = group
):repo目录以及以后在其中创建的所有目录将由git管理,以允许mygroup
读取,写入和执行权限(同时设置了sgid位-以便与mygroup
不是其用户的用户一起工作初级组)receive.denyNonFastforwards = 1
:拒绝非快速推送到仓库如果要微调的用户,组或其他用户的权限,使用--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
来设置存储库的所有者,然后git init
以该用户身份运行命令(以确保使用正确的所有者初始化存储库。所有初始文件和子目录)。