制作git push尊重权限?

use*_*r10 15 git permissions

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

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

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

Chr*_*sen 15

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


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

设置core.sharedrepository0660远程仓库是让你说什么你想要的正确方法.远程端访问用户的umask也无关紧要,因为Git会在看到0xxx值时覆盖掩码core.sharedrepository.您需要确保所有文件和目录都是由您的公共组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; uids; gids;用户和组所有权,以及推送前后文件和目录的权限),而不是在中间进行某种传输时(Git自己的基于SSH的传输,或者可能无法以完全保真的方式映射ID和权限的网络文件系统).

  • 关于--shared的一个注意事项:它不像umask一样运行,你在减去权限,而是指定它将设置的权限.--shared = 0077因此意味着所有者无法访问它,但团体和世界可以.(它将拒绝此选项)而--shared = 0700表示只有所有者才能访问它. (2认同)