有没有办法阻止 git 更改拉取时的权限和所有权?

有没有办法阻止 git 更改拉取时的权限和所有权?

每次我执行git pull或操作时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

输出:

$ ./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 上获取新文件继承组权限

答案2

我使用的解决方案是以用户身份运行命令具有您想要保留的权限:

sudo -u user command

这可以防止权限发生更改。我在更新 VPS 上的 git 存储库时使用它,同时将文件权限设置为网络服务器用户。

另请参阅同一问题这里

相关内容