有没有一种方法可以防止git更改pull上的权限和所有权?


11

每次执行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)

有没有解决的办法?

我想使某些文件/目录可被Web服务器访问。

Answers:


4

听起来您正在运行的用户的默认组设置为yuri。您可以这样确认:

$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)

您帐户的UID是这样的:uid=1000(saml)而默认组是git=1000(saml),此后是任何辅助组。

注意:如果您希望git克隆具有特定的所有权,那么您至少有2个选项。

选项1

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

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

$ cd topdir
$ git clone ....

这迫使目录topdir强制执行其下的所有子目录以http应用该组。这将大体上起作用,但是会导致问题,因为如果将文件移动到此git clone工作区中,则这些文件将不会通过上述更改来强制执行其文件组。

选项#2

在进行工作之前,将默认组更改为http

$ newgrp http
$ git clone ...

此方法将强制所有创建的新文件将其组设置为,http而不是将其设置为正常的默认组yuri,但这仅在您记住newgrp在此工作空间中进行操作之前记得起作用。

其他选择

如果以上两种方法都不可接受,则可以尝试在git工作区目录中使用ACL。这些在本站点的多个问答中进行了讨论,例如在本题为“ 获取新文件以继承Linux上的组权限 ”的问答中。


首先,你必须是有意义的newgrp。然后,是否仅更改当前shell的组?最后,重点是只允许Web服务器访问特定文件/目录以进行写入。毕竟,我可能应该手动修复它们,或者设置一些git挂钩...
x-yuri

@ x-yuri-是的,抱歉,现在是凌晨5点,我要去睡觉8-)。是的,这仅适用于当前的shell,因此这是该方法的缺点。如果您只打算对Web服务器进行某些访问,那将很棘手,那么您很可能想要使用ACL。另外,您可能希望将这些详细信息添加到您的问题中。由于目前尚不清楚您的预期目的是什么,因此我只能以非特定的术语回答您。
slm

1
@ X-尤里-像这样的帖子更新挂钩可能更贴切:stackoverflow.com/questions/9613545/...
SLM

1
@ x-yuri-控制权限在git书中的钩下进行了讨论:git-scm.com/book/en/Customizing-Git-Git-Hooks
slm

老实说,我实际上没有看到仅更改当前shell的组可能会有什么弊端。我担心它不会改变其余应用程序的工作方式。
x-yuri

2

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

sudo -u user command

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

在这里也可以看到相同的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.