注:我假設你正在使用與每個用戶登錄基於SSH協議的訪問機制到服務器作爲自己的用戶(即你沒有多個用戶登錄到一個帳戶來訪問存儲庫)。如果這個假設不成立,那麼下面的答案可能並不完全有用。
您的個人資料庫的core.sharedrepository
設置和的umask用來訪問它無關對遠程倉庫使用的所有權和權限。
在遠程存儲庫中設置core.sharedrepository
到0660
是正確的方式來獲取您要說的內容。在遠程端訪問用戶的的umask也無關緊要,因爲GIT中將覆蓋掩模時,看到爲core.sharedrepository
一個0xxx
值。您確實需要確保所有文件和目錄由您的通用組歸屬,並且權限正確(對於所有目錄(或者對於BSD-ish系統,只是770
);對於objects/??
和/objects/pack/
下的文件,440
;對於所有目錄的2770
;其他文件爲660
)。
這是正常的,一個新的文件是用戶擁有的創建它的用戶。在非BSD系統上,需要目錄上的setgid位(2000
位)使新條目繼承其父目錄的組所有者。用戶擁有者很少被繼承(FreeBSD可以配置爲使用setuid位來完成,但是這在正常配置中不會使用)。因此,所有的文件和目錄,都應有相同的,共同的,集團所有者,但每次寫入倉庫(如推)將離開這是用戶所擁有的寫作用戶(即一些文件和/或目錄並不要求任何一個用戶(您的rUser
?)成爲所有文件和目錄的用戶所有者;任何需要訪問存儲庫的用戶都應該是普通組的成員)。
每個用戶都將明顯的用戶擁有的任何文件,/他們創建目錄,但他們也將用戶自己的大部分文件,他們修改,因爲Git使用「原子重寫」(它寫入新的內容一個新的單獨的文件放在同一個目錄中,然後在原始文件的頂部重命名它)。
也許有一個錯誤的方式是Git覆蓋新文件的umask。究竟哪些文件獲得的權限太寬?您在遠程端要在存儲庫上訪問什麼版本的Git?你在遠程端運行什麼操作系統?
我無法重現與Git 1.7.4.1與我的Unixy機器上的兩個用戶和一個共同組的問題。
您可能會嘗試簡化場景。嘗試直接從服務器本身推送到遠程存儲庫(即,建立本地克隆並推送到丟棄分支)。只進行本地訪問可以更容易地檢查您的假設(umask; uids; gids;用戶和羣組所有權,以及在推送前後的文件和目錄的權限),而不是在中間有某種類型的傳輸(Git自己的基於SSH的傳輸,或者可能無法完全保真地映射ID和權限的網絡文件系統)。
您如何訪問遠程存儲庫?聽起來您可能正在使用基於SSH的方法('host:path'或'ssh:// host/path'存儲庫URL)。如果您使用的是網絡文件系統,則可能會使事情變得複雜。 – 2011-03-11 07:41:17
我正在使用ssh訪問,而遠程文件系統實際上是一個NFS文件系統(我不確定爲什麼文件系統會影響這裏的任何東西)。 – user10 2011-04-05 13:57:05