~/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)不支持扩展属性。