2011-03-10 64 views
13

我們使用託管在遠程位置的git倉庫,並且共享。我們希望回購爲可寫的用戶&組可讀&,但不具有其他權限。遠程回購由不同的用戶擁有(如rUser)。我在本地回購中將core.sharedRepository設置爲0660,以及遠程回購。另外,我的umask是0027。所以,無論何時我創建一個新文件,它都沒有其他權限。使git推尊重權限?

儘管如此,由於某種原因,每當我將更改推送到遠程回購時,它都會在repo.git/objects/目錄中創建一些新對象,其權限爲-r--r--r--。更奇怪的是它讓我(而不是遠程用戶)成爲目錄/文件的所有者。任何想法發生了什麼?

我試圖去在計算器上幾個看似相關的問題找到答案,但無法找到任何東西。

+0

您如何訪問遠程存儲庫?聽起來您可能正在使用基於SSH的方法('host:path'或'ssh:// host/path'存儲庫URL)。如果您使用的是網絡文件系統,則可能會使事情變得複雜。 – 2011-03-11 07:41:17

+0

我正在使用ssh訪問,而遠程文件系統實際上是一個NFS文件系統(我不確定爲什麼文件系統會影響這裏的任何東西)。 – user10 2011-04-05 13:57:05

回答

13

注:我假設你正在使用與每個用戶登錄基於SSH協議的訪問機制到服務器作爲自己的用戶(即你沒有多個用戶登錄到一個帳戶來訪問存儲庫)。如果這個假設不成立,那麼下面的答案可能並不完全有用。


您的個人資料庫的core.sharedrepository設置和的umask用來訪問它無關對遠程倉庫使用的所有權和權限。

在遠程存儲庫中設置core.sharedrepository0660是正確的方式來獲取您要說的內容。在遠程端訪問用戶的的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和權限的網絡文件系統)。

+0

感謝您的回答克里斯。然而,對我來說,一件非常簡單的事情起作用我刪除了我個人的回購副本,並簽出了一份全新的副本。現在事情就像他們應該做的那樣工作,即git尊重所有權限。我正在使用git的1.7.2.2版本。 – user10 2011-04-05 14:00:10

+1

關於--shared的一個注意事項:它不像umask那樣操作,你正在減去權限,而是指定它將設置的權限。 --shared = 0077因此表示所有者無法訪問它,但是該組和世界可以。 (它會拒絕這個選項),而--shared = 0700意味着只有所有者才能訪問它。 – 2011-09-02 03:38:39

-2

我強烈建議您使用Gitolite這是管理上的git倉庫控制訪問一個真正efficent工具。