我们正在通过文件路径访问共享git存储库,出于各种原因我现在将省略,使用--shared = group创建。
我们有各种unix组,但都有一个共同的组。如果我在git存储库上运行chgrp -R,每个人都可以从中读取,但如果有人写入它,则通常会创建不使用公共组的新文件。
这个问题似乎是因为我们的主要群组不是共享群组,如果我们运行newgrp,那么似乎一切正常。
但这种方法存在问题; newgrp很慢,它产生了一个新shell,这让我觉得在.bash_profile中调用它会是一个坏主意,甚至不考虑我们是否希望所有我们的新文件使用共同群体。在做任何git工作之前依靠内存来运行它似乎也是灾难的一种方法。
那么......有什么建议吗?
答案 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
。
如果我找回来,我会把来源放在评论中。