如何在git存储库上正确使用组文件权限?

我们通过文件path访问一个共享的git仓库,由于各种原因,我现在要省略,用–shared = group创build。

我们有各种unix组,但都有一个共同的组。 如果我在git仓库上运行chgrp -R,每个人都可以从中读取,但是如果有人给它写信的话,那么创build的新文件不会使用公共组。

这个问题似乎是因为我们的主要组不是共享的,如果我们运行一个newgrp似乎工作得很好。

这种方法虽然有问题, newgrp很慢,并且产生了一个新的shell,这让我觉得在.bash_profile中调用它是一个坏主意,甚至不考虑我们是否希望所有新文件都使用公共组。 依靠内存来运行它之前做任何git工作似乎也是一个灾难的秘诀。

那么…有什么build议?

您还需要在组上设置setgid位 。

 chgrp -R GROUP / path / to / repo
 find / path / to / repo -type d -print0 |  xargs -0 chmod g + s 

尚未使用--shared创建的现有存储库可以使用以下命令转为共享:

 # make the repository shared git config core.sharedRepository group # or whatever other sharing option # fix the setgid bit find . -type d | xargs chmod g+s # repair the permissions chmod -R g+r * 

这是一个光秃秃的回购? 如果它是一个裸回购,并且在创建时使用了 – 共享,那么这不应该发生,这就是为什么我要问。

如果这是一个裸回购,也许有些目录变成了gs,如果发生了这种情况,你需要chmod g+x所有的目录,确保你没有做任何文件。 一个比这更简单的方法可能就是git init --bare --shared=group一个新的repo组合起来,然后把内容从somebody克隆中推回去。

我不得不使用上面的答案组合:

 git config core.sharedRepository group chgrp -R GROUP /path/to/repo find /path/to/repo -type d -exec chmod g+rwxs {} \; 

一旦裸仓库具有shared=group标志,git将负责其余的事情,所以下面的事情只能做一次。 此外setgid已被弃用,用于此用途。 在这里,我复制/粘贴我的答案从serverfault :

假设repogroup是你的组,并且你有cd到repo目录:

首先将共享标志更改为group

 git config core.sharedRepository group 

注意:这里您必须使用关键字group ,而不是组名称。 这相当于使用选项--shared=group创建裸存储库。

然后更改整个存储库的组:

 chgrp -R repogroup . 

为了确保现有目录是可写组( g+w ),并且现有可执行文件也成为组可执行文件( g+X ),您还需要:

 chmod -R g+wX . 

一旦你完成了这个任务,git将会尊重shared=group标志,并且在现有的和新的文件中处理下面的组权限,所以你不需要再次使用umask或者chgrp

如果我找回来的话,我会把源文件放在注释里。