每次我执行git pull
或操作时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
输出:
$ ./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)
有办法解决吗?
我想让一些文件/目录可供网络服务器写入。
答案1
这听起来像是您正在运行的用户将默认组设置为yuri
。您可以这样确认:
$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)
您帐户的 UID 是这样的:uid=1000(saml)
而默认组是git=1000(saml)
,其后的任何辅助组都是。
笔记:如果您希望 git clone 具有特定所有权,那么您至少有 2 个选择。
选项1
根据需要设置具有权限的父目录,如下所示:
$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
这迫使目录topdir
强制其下面的任何子目录应用该组http
。这在很大程度上可以工作,但可能会导致问题,因为如果将文件移动到此 git 克隆工作区中,这些文件将不会通过上述更改强制执行其组。
选项#2
在开始工作之前,将默认组更改为http
如下所示:
$ newgrp http
$ git clone ...
此方法将强制创建的任何新文件将其组设置为 ,http
而不是正常的默认组yuri
,但这只有在您记得newgrp
在此工作区中工作之前执行 a 操作时才有效。
其他选项
如果这些看起来都不可接受,您可以尝试在 git 工作区目录上使用 ACL。这些问题在本网站的多个问答中进行了讨论,例如标题为:在 Linux 上获取新文件继承组权限。