我为用户设置了一个裸 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
注意setgidnew 中的位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 设置来解决这个问题吗?或者你能解释一下是什么原因造成的吗?