2

我为用户设置了一个裸 git 存储库fred

/home/fred/foo.git

我已将每个文件的组设置foo.gitbar

$ 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没有设置,即使它的父目录设置objectssetgid位。

如果我尝试手动重现:

$ 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 设置来解决这个问题吗?或者你能解释一下是什么原因造成的吗?

4

1 回答 1

1

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

之所以会出现这种糟糕的结果,是因为 gitchmod()似乎成功了——您可以在 strace 中看到它——但忽略了发布用户无权要求的任何内容。

所以为了避免这种奇怪,要做的是

git config --unset core.sharedrepository

(或者在初始化时根本不指定 --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$ 
于 2013-04-08T23:07:18.373 回答