在`.git`文件夹的新目录下,setgid位没有被保存?

我有一个纯粹的git仓库设置用户fred

 /home/fred/foo.git 

我已经将foo.git的每个文件的组设置为bar

 $ chown -R fred:bar /home/fred/foo.git 

(注意fred不是组bar的成员)

我已经为foo.git每个目录设置了setgid位:

 $ 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/14setgid位未设置。 因此,当一个新的对象被添加到该目录时:

 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..文件没有组bar ,它有组fred

我怀疑,当fred提交时,git创build了一个名为objects/14的新目录来保存一个新的对象,当这样做是因为一些未知的原因,新目录14上的setgid位没有被设置,即使它的父目录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 

注意新的test1/test2setgid保留,所以当我…

 $ touch test1/test2/test3 

如预期的那样,新文件仍然是组bar

 $ ls -l test1/test2 -rw-rw-r-- 1 fred bar 0 Apr 8 21:36 test3 

为什么在git目录下创build新目录时, git似乎不能保留setgid位呢?

有没有一些git设置可以解决这个问题? 或者你能解释是什么原因造成的?

事实证明,当你指定core.sharedrepository配置时,git对它创建的文件执行chmod() 。 这样一来,尽管文件系统类型和挂载选项是正确的, 但是在存储库所有者不是共享组的成员的情况下。

这个不好的结果发生是因为git的chmod()似乎成功了 – 你可以在strace中看到它 – 但忽略了颁发用户无权要求的任何东西。

所以为了避免这个怪事,要做的事情是

 git config --unset core.sharedrepository 

(或者不在init中指定–shared),所以git根本不触及文件系统的默认权限。 有趣的是,使一切工作:

 ~/sandbox/75276/s$ find ../s.git -ls 12193569 4 drwxrws--- 4 jthill mail 4096 Apr 9 13:52 ../s.git 12193571 4 -rw-rw---- 1 jthill mail 73 Apr 8 20:40 ../s.git/description 12193572 4 -rw-rw---- 1 jthill mail 23 Apr 8 20:40 ../s.git/HEAD 12721086 4 drwxrws--- 2 jthill mail 4096 Apr 9 13:52 ../s.git/objects 12193570 4 drwxrws--- 2 jthill mail 4096 Apr 9 13:52 ../s.git/refs 12193578 4 -rw-rw---- 1 jthill mail 104 Apr 9 13:37 ../s.git/config ~/sandbox/75276/s$ cat ../s.git/config [core] repositoryformatversion = 0 filemode = true bare = true [receive] denyNonFastforwards = true ~/sandbox/75276/s$ git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 198 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To /home/jthill/sandbox/75276/s.git * [new branch] master -> master ~/sandbox/75276/s$ find ../s.git -ls 12193569 4 drwxrws--- 4 jthill mail 4096 Apr 9 13:52 ../s.git 12193571 4 -rw-rw---- 1 jthill mail 73 Apr 8 20:40 ../s.git/description 12193572 4 -rw-rw---- 1 jthill mail 23 Apr 8 20:40 ../s.git/HEAD 12721086 4 drwxrws--- 5 jthill mail 4096 Apr 9 13:53 ../s.git/objects 16777964 4 drwxrwsr-x 2 jthill mail 4096 Apr 9 13:53 ../s.git/objects/58 16777965 4 -r--r--r-- 1 jthill mail 17 Apr 9 13:53 ../s.git/objects/58/7be6b4c3f93f93c489c0111bba5596147a26cb 16777962 4 drwxrwsr-x 2 jthill mail 4096 Apr 9 13:53 ../s.git/objects/ab 16777963 4 -r--r--r-- 1 jthill mail 46 Apr 9 13:53 ../s.git/objects/ab/69b4abf3bb84d4e268bd42d84e4a9a5e242bd3 16777960 4 drwxrwsr-x 2 jthill mail 4096 Apr 9 13:53 ../s.git/objects/81 16777961 4 -r--r--r-- 1 jthill mail 120 Apr 9 13:53 ../s.git/objects/81/210f2df9629e5df5f6dfa0923a2cf72369314d 12193570 4 drwxrws--- 3 jthill mail 4096 Apr 9 13:53 ../s.git/refs 12193573 4 drwxrwsr-x 2 jthill mail 4096 Apr 9 13:53 ../s.git/refs/heads 12193574 4 -rw-rw-r-- 1 jthill mail 41 Apr 9 13:53 ../s.git/refs/heads/master 12193578 4 -rw-rw---- 1 jthill mail 104 Apr 9 13:37 ../s.git/config ~/sandbox/75276/s$