如何在 git 存储库上正确使用组文件权限?

Posted

技术标签:

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

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

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

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

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

那么……有什么建议吗?

【问题讨论】:

试试gitolite,你只需要一个git用户。 下载更多软件对我们来说并不是一个真正的选择。 【参考方案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 位:***.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 克隆推回它。

【讨论】:

以上是关于如何在 git 存储库上正确使用组文件权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何在远程存储库上使用 git bisect?

删除不再在远程存储库上的本地 git 标签

在已跟踪大量文件的现有存储库上应用gitignore

如何从 git grep 搜索中排除某些目录/文件

如何在旧代码库上使用 gitversion

如何在GIT Rebase Interactive Squash之后删除远程存储库上的历史记录提交消息