如何在 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
标志并在以下处理现有文件和新文件的组权限,因此您将不再需要 umask
或 chgrp
。
如果我找到它,我会将来源放在评论中。
【讨论】:
【参考方案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 存储库上正确使用组文件权限?的主要内容,如果未能解决你的问题,请参考以下文章