git 中的一些用户阻止其他用户使用 git 和 SSH 将提交推送到远程

Some users in git prevent other users to push commits to the remote using git with SSH

我们正在使用 git 进行源代码管理,并拥有一个 SLES 服务器,我们将其用作 git 存储库的远程服务器。我们使用 SSH 访问 git,使用 真实用户名 ,而不是单个 git 用户替代方案,后者将通过 authorized_keys 文件进行身份验证git 用户。

不久前,我发现了推送到遥控器的问题。一个用户能够推送而另一个用户不能推送。于是我开始分析,为什么有的用户推送不了。我终于弄清楚了根本原因是什么:远程上的裸存储库总是有一个名为 objects 的目录,其中提交最终通过推送过程保存。该目录包含带有散列值前两个字符的子目录。如果尚未创建目录,则会在推送到远程期间创建。

神秘之处在于,我无法向自己解释:一些用户使用 rwxrwsr-x 权限创建这些目录,而其他用户使用 rwxr-swr-x 创建它们。如您所见,设置了 set-gid 位,这没问题。但我无法真正解释为什么有些用户创建的目录具有 group write 权限,而其他用户则没有。

这里的陷阱是,如果用户A创建了一个没有组写权限的目录,而用户B计算了一个以用户A已经创建的目录的两个字符开头的hash值,用户B就不能放置文件(commit)在同一个目录中,这使得无法为用户 B 推送到远程。

我已经注意了默认的 umask 设置,它们可能不同,但找不到不同的设置。我们 SLES 服务器上的所有用户都有默认掩码 0022,这将导致使用 rw-r--r-- 创建文件和使用 rwxr-xr-x 创建目录。这是第二个谜团:为什么一些用户在 git 中使用 rwxrwsr-x 创建目录(这对于 git 是正确的并且是预期的),尽管有 umask 0022

有没有人提示我进一步排除故障?我想要实现的是用户使用 rwxrwsr-x.

创建 objects 子目录

设置

git config core.sharedRepository 0660

在服务器仓库。参见 the docs