制作git push尊重权限?

时间:2011-03-10 19:40:54

标签: git permissions

我们使用托管在远程位置的git repo,并且是共享的。我们希望回购是用户&群体可读和可写,但对其他人没有任何权限。远程仓库由不同的用户(比如rUser)拥有。我在本地仓库中设置了core.sharedRepository0660,以及远程仓库。另外,我的umask是0027。因此,每当我创建一个新文件时,它都没有其他权限。

尽管如此,出于某种原因,每当我将更改推送到远程仓库时,它都会在repo.git/objects/目录中创建一些具有权限-r--r--r--的新对象。甚至更奇怪的是,它使我(而不是远程用户)成为目录/文件的所有者。知道发生了什么事吗?

我尝试通过在stackoverflow上查看几个看似相关的问题来找到答案,但找不到任何内容。

2 个答案:

答案 0 :(得分:15)

注意:我假设您使用的是基于SSH的访问机制,每个用户都以自己的用户身份登录服务器(即,您没有多个用户登录到单个帐户来访问存储库)。如果这个假设不成立,那么以下答案可能并不完全有用。


您用于访问它的个人存储库的core.sharedrepository设置和 umask 与远程存储库上使用的所有权和权限无关。

在远程存储库中将core.sharedrepository设置为0660是获得所需内容的正确方法。远程端访问用户的 umask 也无关紧要,因为Git会在看到0xxx的{​​{1}}值时覆盖掩码。您需要确保所有文件和目录都是由您的公共组所有,并且权限是正确的(对于所有目录core.sharedrepository(或者对于BSD-ish系统只是2770); 770440下的文件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存储库的控制访问。