让git push遵循权限?

15
我们使用在远程位置托管的git仓库,并且是共享的。我们希望该仓库对用户和组可读写,但不对其他人开放权限。远程仓库归另一个用户(假设为rUser)所有。我已将core.sharedRepository设置为0660,分别在本地仓库和远程仓库中。此外,我的umask值为0027。因此,每当我创建一个新文件时,它没有其他任何权限。
尽管如此,出于某种原因,每当我向远程仓库推送更改时,它都会创建一些新对象,在repo.git/objects/目录中的权限是-r--r--r--。更奇怪的是,它让我(而不是远程用户)成为目录/文件的所有者。有什么想法吗?
我曾经尝试通过查看stackoverflow上似乎相关的几个问题来找到答案,但是没有找到任何信息。

你是如何访问远程仓库的?听起来你可能正在使用基于SSH的方法(host:pathssh://host/path存储库URL)。如果你使用的是网络文件系统,那么可能会使事情变得复杂。 - Chris Johnsen
我正在使用ssh进行访问,远程文件系统实际上是一个NFS文件系统(虽然我不确定为什么文件系统会影响任何东西)。 - user10
2个回答

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


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

在远程存储库中将core.sharedrepository设置为0660是实现你所说的目标的正确方式。远程端访问用户的umask也无关紧要,因为Git会在看到core.sharedrepository0xxx值时覆盖掉该掩码。你需要确保所有文件和目录都由共同的组拥有,并且权限正确(对于所有目录,权限应为2770(或者对于类似BSD的系统,只需770);对于objects/??/objects/pack/下的文件,权限应为440;对于其他文件,权限应为660)。

新文件由创建它的用户拥有是正常的。在非BSD系统上,你需要在目录上设置setgid位(2000位)以使新条目继承其父目录的组所有者。通常不会继承用户所有者(FreeBSD可以使用setuid位进行配置,但这在正常配置中不使用)。因此,所有文件和目录都应该有相同的、共同的组所有者,但每次对存储库的写操作(例如推送)都会留下一些由写入用户1拥有的文件和/或目录(即,并不要求任何一个用户(你的rUser?)是所有文件和目录的用户所有者;需要访问存储库的任何用户都应该是共同组的成员)。

1

每个用户显然都拥有自己创建的任何文件/目录,但由于Git使用“原子重写”(它将新内容写入同一目录中的新文件中,然后将其重命名为原始文件),他们也会拥有大多数修改的文件。
可能存在一个Git在覆盖新文件的umask时出现错误的bug。哪些文件获得了过宽的权限?您在远程端访问存储库时使用的是哪个Git版本?您在远程端运行的操作系统是什么?
我无法在我的Unixy机器上使用两个用户和一个公共组以及Git 1.7.4.1复制此问题。
您可以尝试简化一下情景。尝试直接从服务器本身推送到远程存储库(即进行本地克隆并推送到丢弃分支)。仅进行本地访问比在中间存在某种传输方式(Git自己的基于SSH的传输或可能不能以完全精度映射ids和权限的网络文件系统)更容易检查您的假设(umask;uids;gids;用户和组所有权以及推送前后文件和目录的权限)。

谢谢你的回答,Chris。然而,对我来说一个非常简单的方法起作用了。我删除了我的个人仓库副本,并检出了一个全新的副本。现在一切都按照应该的方式工作,即git尊重所有权限。我正在使用1.7.2.2版本的git。 - user10
2
关于--shared的一个注意事项:它不像umask那样运作,你不是在减去权限,而是在指定它将设置的权限。因此,--shared=0077意味着所有者无法访问它,但组和全局可以访问。(它将拒绝此选项),而--shared=0700意味着只有所有者可以访问它。 - Graham Christensen

-2

我强烈建议您使用Gitolite,这是一个非常高效的工具,用于管理Git存储库上的访问控制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接