2011-03-10 77 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工具。