有没有办法防止 git 在 pull 时更改权限和所有权?

x-y*_*uri 12 permissions git

每次执行git pullor 时git resetgit都会重置对我所做的权限和所有权的更改。你自己看:

#!/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 服务器写入。

slm*_*slm 5

这听起来像您正在运行的用户将默认组设置为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 个选项。

选项1

根据需要设置具有权限的父目录,如下所示:

$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir

$ cd topdir
$ git clone ....
Run Code Online (Sandbox Code Playgroud)

这迫使目录topdir强制其下的任何子目录http应用该组。这将在很大程度上起作用,但可能会导致问题,因为如果您将文件移动到这个 git clone 工作区,这些文件将不会通过上述更改强制执行它们的组。

选项#2

在开始工作之前,将您的默认组更改为http如下所示:

$ newgrp http
$ git clone ...
Run Code Online (Sandbox Code Playgroud)

此方法将强制创建的任何新文件将其组设置为 ,http而不是您的正常默认组yuri,但这仅在您记得newgrp在此工作区中工作之前执行时才有效。

其他选项

如果这些似乎都不可接受,您可以尝试在 git 工作区目录上使用 ACL。本网站上的多个问答中讨论了这些问题,例如在标题为:在 Linux 上获取新文件以继承组权限的问答中。