2013-04-08 64 views
2

我有用户fred裸git仓库设置:setgid位未被git保存在`.git`文件夹中的新目录中?

/home/fred/foo.git 

我已经在组中foo.git每个文件设置为bar

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

(注意fred不是组的成员bar

而且我已经为中的每个目录设置了setgid位10:

$ 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

我怀疑,当COMMITED fred,混帐创建点播叫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 

发现新test1/test2setgid保存,所以当我...

$ touch test1/test2/test3 

新文件仍然是按预期组bar

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

为什么git似乎在.git目录中创建新目录时似乎保留setgid位?

有一些我可以解决这个问题的git设置?或者你能解释是什么造成了这种情况?

回答

1

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

糟糕的结果发生是因为git的chmod()看起来成功了 - 你可以在strace中看到它 - 但忽略发布用户无权请求的任何内容。

因此,为了避免weirdity,要做的事情是

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$ 
+0

我已经'core.sharedRepository = 0660'集。我无法更改它,因为我不希望该存储库具有世界可读性。使用'core.sharedRepositoy = 0660'观察描述的行为(不保留setgid位)。 – 2013-04-08 23:12:22

+0

这不是(不希望的)设置文件和目录的'setgid'位吗? – 2013-04-08 23:21:21

+0

有人实施它后多长时间,你认为这将需要笑声开始的嘲笑嚎叫?不,git的“愚蠢的内容跟踪器”等等,但我真的认为他在这方面使用这个词来表示其他意思。 – jthill 2013-04-08 23:26:05

相关问题