每次执行git pullor 时git reset,git都会重置对我所做的权限和所有权的更改。你自己看:
#!/usr/bin/env bash
rm -rf 1 2
mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1
git clone . ../2
cd $_
chmod 0640 1
chgrp http 1
cd ../1
echo 12 > 1 && git ci -am 2
cd ../2
stat 1
git pull
stat 1
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----) Uid: ( 1000/ yuri) Gid: ( 33/ http)
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yuri) Gid: ( 1000/ yuri)
Run Code Online (Sandbox Code Playgroud)
有没有办法解决它?
我想让一些文件/目录可访问以供 Web 服务器写入。
这听起来像您正在运行的用户将默认组设置为yuri。您可以像这样确认这一点:
$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)
Run Code Online (Sandbox Code Playgroud)
您帐户的 UID 是这样的:uid=1000(saml)而默认组是git=1000(saml),其后是任何次要组。
注意:如果您希望 git clone 具有特定的所有权,那么您至少有 2 个选项。
根据需要设置具有权限的父目录,如下所示:
$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
Run Code Online (Sandbox Code Playgroud)
这迫使目录topdir强制其下的任何子目录http应用该组。这将在很大程度上起作用,但可能会导致问题,因为如果您将文件移动到这个 git clone 工作区,这些文件将不会通过上述更改强制执行它们的组。
在开始工作之前,将您的默认组更改为http如下所示:
$ newgrp http
$ git clone ...
Run Code Online (Sandbox Code Playgroud)
此方法将强制创建的任何新文件将其组设置为 ,http而不是您的正常默认组yuri,但这仅在您记得newgrp在此工作区中工作之前执行时才有效。
如果这些似乎都不可接受,您可以尝试在 git 工作区目录上使用 ACL。本网站上的多个问答中讨论了这些问题,例如在标题为:在 Linux 上获取新文件以继承组权限的问答中。