“setfacl”权限不适用于 git clone 创建的目录?

“setfacl”权限不适用于 git clone 创建的目录?

~/public_html以下是我如何为网站的根目录(即我的网站所提供的文件所在的位置)设置权限:

sudo chgrp -R www-data ~/public_html
chmod g+s ~/public_html
chmod g+rwx ~/public_html
setfacl -m d:g:www-data:rwx ~/public_html
  • 命令#1授予“www-data”组所有权访问权限~/public_html
  • #2设置组 ID,以便其中的所有新目录/文件也归“www-data”组所有
  • #3将目录上“www-data”组的访问权限设置为 775;
  • #4确保这同样适用于在~/public_html.

它工作得很好,正如它应该的那样。所有新创建的目录和文件都会继承强制权限。

问题在于git clone(在我之后cd ~/public_html && git clone ....)创建的目录。

更新:目录继承组ID(即“www-data”拥有新创建的目录),但不是访问权限(目录为 775,文件为 664)。而且,它只是 git 创建的顶级目录。每个具有应有继承权限的目录和文件。难道是Debian的git包没有这个修复此错误然而?

我究竟做错了什么?相反,我到底应该如何做呢?

答案1

git创建文件后可能会覆盖 GID 和 ACL(就像mv跨设备移动时的简单操作一样)。您可以通过 strace ( strace -f -o git.strace -e trace=file) 运行来检查这一点。

答案2

如果您看到使用不同的权限git clone,那么很可能是您umask造成的:

$ umask
0002

运行该命令时创建的新文件git clone将根据您umask指定的权限创建。 Umask 表示哪些位应该被屏蔽。因此,在上面的示例中,我使用 umask 创建的任何新文件0002都会关闭其他写入位。

参考

答案3

克隆目录的扩展属性可能git失败public_html

Linux 下的 ACL(以及 SELinux 文件标签)是使用基于文件系统的扩展属性来实现的(请参阅 attr、getfattr、setfattr 的手册页)。必须显式复制扩展属性才能保留它们。大多数现代 Linux 发行版中的大多数文件实用程序(mv、cp、tar、rsync、rm 等)都已更新以支持扩展属性(以及扩展的 ACL)。

重做 strace 但忽略该-e trace=file部分,将其通过管道传输到grep xattr,然后查看是否有任何对 setxattr 的调用。

strace -f 2>&1 git clone | grep xattr

如果您没有看到任何输出,则 git(或者至少您正在使用的 git)不支持扩展属性。

相关内容