让git推送尊重权限?

让git推送尊重权限?,git,permissions,Git,Permissions,我们使用的git repo托管在远程位置,并且是共享的。我们希望回购协议是用户和组可读写的,但对其他协议没有任何权限。远程回购由另一个用户(比如rUser)拥有。我已在本地回购和远程回购中将core.sharedepository设置为0660。另外,我的umask是0027。因此,每当我创建一个新文件时,它对其他文件都没有权限 尽管如此,出于某种原因,每当我将更改推送到远程repo时,它都会在repo.git/objects/目录中创建一些具有权限的新对象-r--r--。更奇怪的是,它让我(而

我们使用的git repo托管在远程位置,并且是共享的。我们希望回购协议是用户和组可读写的,但对其他协议没有任何权限。远程回购由另一个用户(比如rUser)拥有。我已在本地回购和远程回购中将
core.sharedepository
设置为
0660
。另外,我的umask是
0027
。因此,每当我创建一个新文件时,它对其他文件都没有权限

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


我试着从stackoverflow的几个看似相关的问题中找到答案,但是找不到任何东西。

我强烈建议您使用这是一种非常有效的工具来管理对git存储库的控制访问。

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


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

在远程存储库中将
core.sharedepository
设置为
0660
是获取所需内容的正确方法。远程访问用户的umask也不相关,因为Git在看到
core.sharedepository
0xxx
值时会覆盖掩码。您需要确保所有文件和目录均为您的公共组所有,并且权限正确(
2770
适用于所有目录(或仅
770
适用于BSD ish系统);
440
适用于
objects/??
/objects/pack/
下的文件;适用于其他文件的
660

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

1. 显然,每个用户都将拥有他们创建的任何文件/目录,但他们也将拥有他们修改的大多数文件,因为Git使用“原子重写”(它将新内容写入同一目录中的一个新的单独文件,然后在原始文件的顶部重命名)。

Git覆盖新文件的umask的方式可能存在缺陷。具体哪些文件获得的权限太宽?您在远程端访问存储库的Git版本是什么?您在远程端运行的操作系统是什么

我无法用Git 1.7.4.1在我的Unixy机器上用两个用户和一个公共组重现这个问题


您可以尝试将场景简化一点。尝试直接从服务器本身推送到远程存储库(即,制作本地克隆并推送到一个丢弃的分支)。只进行本地访问可以更容易地检查您的假设(UMASK;UID;GIDS;用户和组所有权,以及在推送前后推送文件和目录的权限),而不是在中间有某种传输时(Git自己的基于SSH的传输,或者网络文件系统可能不映射IDS和权限)。.

您如何访问远程存储库?听起来您可能在使用基于SSH的方法(
host:path
ssh://host/path
repository url)。如果改用网络文件系统,可能会使事情变得复杂。我使用ssh访问,而远程文件系统实际上是一个NFS文件系统(但我不确定文件系统为什么会影响此处的任何内容)。谢谢你的回答。克里斯。然而,对我来说,一件非常简单的事情起了作用。我删除了我个人的回购协议副本,并签出了一份全新的副本。现在一切正常了,即git尊重所有权限。我使用的是git的1.7.2.2版。关于--共享的一个注意事项:它不像umask那样运行,你要减去permissions,而是指定它将设置的权限。-shared=0077因此表示所有者无法访问它,但组和世界可以访问它。(它将拒绝此选项),而--shared=0700表示只有所有者才能访问它。