我为用户设置了一个裸 git 存储库fred
:
/home/fred/foo.git
我已将每个文件的组设置foo.git
为bar
:
$ chown -R fred:bar /home/fred/foo.git
(注意fred
不是 group 的成员bar
)
我已经setgid
为每个目录设置了位foo.git
:
$ find foo.git -type d -print0 | xargs -0 chmod g+s
但是,当fred
提交到 git 存储库时,该组不会保留在某些文件中。
特别是在objects
我看到的目录中:
foo.git/objects:
drwxrws--- 46 fred bar 4096 Apr 7 23:43 .
drwxrws--- 7 fred bar 4096 Apr 6 17:12 ..
drwxrws--- 2 fred bar 4096 Apr 6 17:11 07
drwxrws--- 2 fred bar 4096 Apr 6 17:11 10
drwxrwx--- 2 fred bar 4096 Apr 7 22:14 14 <--- HERE
drwxrws--- 2 fred bar 4096 Apr 6 17:11 17
^--- HERE
请注意,未设置objects/14
该位。setgid
因此,当一个新对象添加到该目录时:
foo.git/objects/14:
drwxrwx--- 2 fred bar 4096 Apr 7 22:14 .
drwxrws--- 46 fred bar 4096 Apr 7 23:43 ..
-r--r----- 1 fred fred 2595 Apr 7 22:14 95482f8..9d6bfe21
所以现在95482..
文件没有 group bar
,它有 group fred
。
我怀疑在提交时fred
,git按需创建了一个新目录,调用objects/14
它来保存一个新对象,当它出于某种未知原因这样做时setgid
,新目录上的位14
没有设置,即使它的父目录设置objects
了setgid
位。
如果我尝试手动重现:
$ su fred # as user fred
$ mkdir test1 # create test1 dir
$ sudo chgrp bar test1 # set group to bar
$ sudo chmod g+s test1 # set setgid bit
$ ls -l
drwxrwsr-x 2 fred bar 4096 Apr 8 21:33 test1
$ mkdir test1/test2 # create dir test1/test2
$ ls -l
drwxrwsr-x 2 fred bar 4096 Apr 8 21:35 test2
^--- HERE
注意setgid
new 中的位test1/test2
被保留了,所以当我...
$ touch test1/test2/test3
新文件仍按bar
预期分组:
$ ls -l test1/test2
-rw-rw-r-- 1 fred bar 0 Apr 8 21:36 test3
为什么在目录中创建新目录时git
似乎没有保留该位?setgid
.git
我可以做一些 git 设置来解决这个问题吗?或者你能解释一下是什么原因造成的吗?