我们使用托管在远程位置的git repo,并且是共享的。我们希望回购是用户&群体可读和可写,但对其他人没有任何权限。远程仓库由不同的用户(比如rUser)拥有。我在本地仓库中设置了core.sharedRepository
到0660
,以及远程仓库。另外,我的umask是0027
。因此,每当我创建一个新文件时,它都没有其他权限。
尽管如此,出于某种原因,每当我将更改推送到远程仓库时,它都会在repo.git/objects/
目录中创建一些具有权限-r--r--r--
的新对象。甚至更奇怪的是,它使我(而不是远程用户)成为目录/文件的所有者。知道发生了什么事吗?
我尝试通过在stackoverflow上查看几个看似相关的问题来找到答案,但找不到任何内容。
答案 0 :(得分:15)
注意:我假设您使用的是基于SSH的访问机制,每个用户都以自己的用户身份登录服务器(即,您没有多个用户登录到单个帐户来访问存储库)。如果这个假设不成立,那么以下答案可能并不完全有用。
您用于访问它的个人存储库的core.sharedrepository
设置和 umask 与远程存储库上使用的所有权和权限无关。
在远程存储库中将core.sharedrepository
设置为0660
是获得所需内容的正确方法。远程端访问用户的 umask 也无关紧要,因为Git会在看到0xxx
的{{1}}值时覆盖掩码。您需要确保所有文件和目录都是由您的公共组所有,并且权限是正确的(对于所有目录core.sharedrepository
(或者对于BSD-ish系统只是2770
); 770
和440
下的文件objects/??
;其他文件的/objects/pack/
。
新文件由创建它的用户拥有,这是正常的。在非BSD系统上,您需要目录上的setgid位(660
位)以使新条目继承其父目录的组所有者。很少继承用户所有者(可以将FreeBSD配置为使用setuid位来执行此操作,但在常规配置中不使用此方法)。因此,所有文件和目录应该具有相同的,通用的组所有者,但每次写入存储库(例如push)将留下一些由写入用户 1 <用户拥有的文件和/或目录。 / sup>(即,不要求任何一个用户(您的2000
?)是所有文件和目录的用户所有者;任何需要访问存储库的用户都应该是公共组的成员)
<子> 1 每个用户显然都会拥有他们创建的任何文件/目录,但他们也会用户拥有他们修改的大多数文件,因为Git使用“原子重写”(它将新内容写入同一目录中的新的单独文件,然后将其重命名为原始文件顶部)。 子>
可能Git正在覆盖新文件的umask方式存在错误。究竟哪些文件获得的权限太宽?你在远程端访问存储库的是什么版本的Git?你在远程端运行什么操作系统?
我无法使用Git 1.7.4.1在我的Unixy计算机上使用两个用户和一个公共组重现此问题。
您可以尝试稍微简化一下场景。尝试直接从服务器本身推送到远程存储库(即创建一个本地克隆并推送到一个扔掉的分支)。进行仅限本地访问可以更容易地检查您的假设(umask; uids; gids;用户和组所有权,以及推送前后文件和目录的权限),而不是在中间进行某种传输时(Git自己的基于SSH的传输,或者可能无法以完全保真的方式映射ID和权限的网络文件系统)。
答案 1 :(得分:-2)
我强烈建议您使用Gitolite这是一个非常有效的工具来管理git存储库的控制访问。