【问题标题】:Making git push respect permissions?让 git push 尊重权限?
【发布时间】:2011-07-13 00:09:05
【问题描述】:

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

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

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

【问题讨论】:

  • 您如何访问远程存储库?听起来您可能正在使用基于 SSH 的方法(host:pathssh://host/path 存储库 URL)。如果您使用的是网络文件系统,则可能会使事情变得复杂。
  • 我正在使用 ssh 访问,而远程文件系统实际上是一个 NFS 文件系统(我不确定为什么文件系统会影响这里的任何东西)。

标签: git permissions


【解决方案1】:

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


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

在远程存储库中将core.sharedrepository 设置为0660 是获得您想要的东西的正确方法。远程端访问用户的 umask 也无关紧要,因为当 Git 看到 core.sharedrepository0xxx 值时,它会覆盖掩码。您确实需要确保所有文件和目录都归您的公共组所有,并且权限正确(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 和权限的网络文件系统)。

【讨论】:

  • 感谢您的回答,克里斯。然而,对我来说,一件非常简单的事情奏效了。我删除了我的个人回购副本,并签出了一个全新的副本。现在一切正常,即 git 尊重所有权限。我正在使用 1.7.2.2 版本的 git。
  • 关于 --shared 的一个注意事项:它不像 umask 那样操作,您要减去权限,而是指定它将设置的权限。 --shared=0077 因此意味着所有者无法访问它,但组和世界可以。 (它会拒绝这个选项)而 --shared=0700 意味着只有所有者可以访问它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多