2013-04-08 63 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

相關問題