注:我假设你正在使用与每个用户登录基于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