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

时间:2011-01-28 19:39:17

标签: git unix permissions file-permissions

我们正在通过文件路径访问共享git存储库,出于各种原因我现在将省略,使用--shared = group创建。

我们有各种unix组,但都有一个共同的组。如果我在git存储库上运行chgrp -R,每个人都可以从中读取,但如果有人写入它,则通常会创建不使用公共组的新文件。

这个问题似乎是因为我们的主要群组不是共享群组,如果我们运行newgrp,那么似乎一切正常。

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

那么......有什么建议吗?

5 个答案:

答案 0 :(得分:22)

您还需要在群组中设置setgid bit

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

答案 1 :(得分:21)

可以使用以下命令转换共享尚未使用--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 *

答案 2 :(得分:9)

这是一个简单的回购?如果它是一个裸露的回购并且您在创建时使用了--shared那么这应该不会发生,这就是我要问的原因。

如果它是一个裸仓库,可能有些目录已更改为g-s,如果发生这种情况,您只需要chmod g+x所有目录,请确保不对任何文件执行此操作。一个比这更简单的方法可能就是git init --bare --shared=group一个新的仓库并将内容从某些车身克隆回来。

答案 3 :(得分:5)

我必须使用上述答案的组合:

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

答案 4 :(得分:4)

一旦裸存储库具有shared=group标志,git将负责其余部分,因此以下必须只进行一次。此用途也不推荐使用setgid。在这里,我复制/粘贴my answer from 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标记并在以下内容中处理组权限,包括现有文件和新文件,因此您再也不需要{{1} }或umask

如果我找回来,我会把来源放在评论中。