【问题标题】:How to use group file permissions correctly on a git repository?如何在 git 存储库上正确使用组文件权限?
【发布时间】:2011-06-17 11:16:12
【问题描述】:

我们正在通过文件路径访问一个共享的 git 存储库,出于各种原因,我现在将省略,使用 --shared=group 创建。

我们有各种 unix 组,但都共享一个共同的组。如果我在 git 存储库上运行 chgrp -R,每个人都可以从中读取,但如果有人经常写入它,则会创建不使用公共组的新文件。

这个问题似乎是因为我们的主要组不是共享组,如果我们运行 newgrp 似乎一切正常。

这种方法存在一些问题; newgrp 很慢,它会生成一个新的 shell,这让我认为在 .bash_profile 中调用它是个坏主意,甚至没有考虑我们是否希望 所有 我们的新文件使用共同组。不过,在执行任何 git 工作之前依赖内存来运行它似乎也是灾难的根源。

那么……有什么建议吗?

【问题讨论】:

  • 试试gitolite,你只需要一个git用户。
  • 下载更多软件对我们来说并不是一个真正的选择。

标签: git unix permissions file-permissions


【解决方案1】:

一旦裸存储库具有shared=group 标志,git 将负责其余的工作,因此只需执行一次以下操作。此外,setgid 不推荐用于此用途。这里我复制/粘贴my answer from serverfault:

假设 repogroup 是您的组,并且您在 repo 目录中有 cd

先把共享标志改成group

git config core.sharedRepository group 

注意:这里必须使用关键字group,而不是组名。 这相当于使用选项--shared=group 创建裸存储库。

然后更改整个存储库的组:

chgrp -R repogroup .

为了确保现有目录是组可写的 (g+w), 并且现有的可执行文件也成为组可执行文件 (g+X) 您还需要:

chmod -R g+wX .

完成此操作后,git 将遵循 shared=group 标志并在以下处理现有文件和新文件的组权限,因此您将不再需要 umaskchgrp

如果我找到它,我会将来源放在评论中。

【讨论】:

    【解决方案2】:

    我不得不使用上述答案的组合:

    git config core.sharedRepository group
    chgrp -R GROUP /path/to/repo
    find /path/to/repo -type d -exec chmod g+rwxs {} \;
    

    【讨论】:

      【解决方案3】:

      可以使用以下命令将尚未使用--shared 创建的现有存储库变为共享:

      # make the repository shared
      git config core.sharedRepository group # or whatever other sharing option
      # fix the setgid bit
      find . -type d | xargs chmod g+s
      # repair the permissions
      chmod -R g+r *
      

      【讨论】:

      • 在我的情况下,我必须执行“chmod -R g+rw *”,因为组应该有权写入而不仅仅是读取。否则感谢您的回答。
      • 感谢@fikovnik,这帮助我使 www-data 用户可以读取我的存储库,而不会在切换分支时丢失权限。除了上面的答案之外,对我来说缺少的部分是将自己添加到 www-data 组 - 否则当我切换分支时目录会丢失 setgid 位。 chmod 手册说这种行为取决于系统。似乎在 Linux 上,除非用户属于该组,否则 chmod 系统调用的行为是清除目录上的 setgid 位,并且似乎 git 使用 chmod 系统调用来应用 core.sharedRepository 设置。
      • 我还必须执行chmod -R g+rw .*(带有句点),因为它是该组其他成员无法写入的.git/FETCH_HEAD 文件,
      【解决方案4】:

      您还需要在群组上设置setgid bit

      chgrp -R GROUP /path/to/repo 查找 /path/to/repo -type d -print0 | xargs -0 chmod g+s

      【讨论】:

      • 永远不要chmod -R g+s git repo,而不是只做你认为你做的事情,你只是在每个文件上启用 setgid。
      • 好吧,如果你打算使用 find ,你不妨全力以赴并使用 -print0 来防止任何疯狂到在其分支/标签名称中使用空格或其他奇怪字符的人。
      • 这对我不起作用,在创建的新目录上 git 由于某种原因没有设置setgid 位:stackoverflow.com/questions/15889573/…
      • 如果父目录是setgid则应该
      • 找到 /path/to/repo -type d -exec chmod g+s {} \;
      【解决方案5】:

      这是一个裸回购吗?如果它是一个裸仓库并且您在创建它时使用了 --shared ,那么这不应该发生,这就是我要问的原因。

      如果它是一个裸仓库,可能某些目录已更改为 g-s,如果发生这种情况,您只需 chmod g+x 所有目录,请确保您不要对任何文件执行此操作。比这更简单的方法可能是 git init --bare --shared=group 一个新的 repo 并将内容从 somebody 克隆推回它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 2011-08-20
        • 2018-08-05
        • 1970-01-01
        • 2010-09-08
        相关资源
        最近更新 更多