Git在检出时更改了我的文件权限

49

我们的工作流程是在本地机器上开发,将更改提交到中央存储库,然后检出我们需要的存储库分支。

问题在于,Git会更改检出的文件的所有权和权限,具体取决于进行检出的用户。直接结果是,在检出后我们的CSS文件变得无法读取,因为Git将文件所有权更改为执行Git pull in the webroot的人。

例如:

  • git pull之前:style.cssuser_a:group_a所有
  • git pull之后:style.cssuser_b:user_b所有

我想保持user_a:group_a的所有权。我不想每次我的团队成员对文件进行更改时都要登录并将所有权更改回原始配置。

其他人是如何处理这个问题的?您如何处理由多个用户使用的存储库?我们的系统上有suphp,不能移除它。


https://dev59.com/-XE85IYBdhLWcg3w_Itr - wojciii
8
Git不是一个部署工具。这是因为它不能存储完整的权限。使用一个适当的部署工具,它支持设置权限等功能。 - Ikke
5个回答

42

Git不会更改文件的权限或所有权。它只是(大多数情况下)不会存储它们,因此它们会更改为与您的用户相同,就像任何其他文件创建一样。

Git支持两个权限集:可执行位开启和可执行位关闭。没有其他信息存储所有权。

参见此线程 -“如果您需要特定的权限,则需要手动设置”。

有一些建议的解决方案:您可以使用单独的工具来为您执行此操作,使用正确的用户帐户和umask组合以默认设置它们,或编写自己的git hook来执行此操作。挂钩必须安装在进行检出的用户上。

正如@ikke在评论中所说的那样,Git实际上并不是部署工具,不应该被用作此类工具。它是用于源代码的版本控制系统。


你推荐哪种部署方法?有没有不需要注册第三方服务的方法?使用带符号链接的scp - zeros-and-ones
@zeros-and-ones 嗯,这取决于你要部署什么。可以通过脚本实现:ansible、salt、capistrano、dandelion等,或者使用CI工具,如gocd、jenkins、deploybot、buildbot、bamboo或类似工具。也可以触发maven工具链等等。根据用例,有很多选择。 - eis
谢谢!部署Web应用程序主要使用LAMP堆栈。最近开始研究Ansible,通过deploy.serverforhackers.com作为资源。就像你提到的那样,有很多名字,很难知道从哪里开始。 - zeros-and-ones

15

对我来说,最好的解决方案是创建一个修复权限的Shell脚本。例如:

.git/hooks/post-checkout:

#!/bin/sh
chmod +x  tools/*

顺便提一句,检出不是git打乱权限的唯一情况,当你拉取时也会发生这种情况。我使用.git/hooks/post-merge钩子来处理这个问题。

理想情况下,您可以在存储库中的某个位置(例如tools/fixpermissions.sh)创建修复权限的shell脚本,并在两个钩子中调用它。别忘了手动更改该文件的权限;)

#!/bin/sh
chmod a+x tools/fixpermissions.sh
tools/fixpermissions.sh

这种方法的缺点是,钩子不是仓库的一部分,因此必须手动创建。但是,可以根据此处描述的步骤来尽量减少钩子设置的工作量:https://dev59.com/FHA75IYBdhLWcg3wH1RB - tishma
1
此外,我需要通过运行以下命令使钩子可执行:chmod ug+x .git/hooks/post-merge - Robert Lujo
1
由于您只是添加可执行位,因此实际上可以将该信息存储在git中。 - eis
@eis 你不能这样做,因为 .git 目录本身不在 git 的控制之下。 - tishma
@eis 当然,你的评论看起来像是对RobertLujo(钩子可执行位)的回应。 ;) - tishma
显示剩余2条评论

3
最简单的解决方案就是直接以user_a身份运行git。


0

我经常运行一个

git checkout -f file.xml

...在一个带有版本控制的file.xml上,该文件具有全局写入权限,因为我不断地对其进行修改并希望将其恢复到正常状态。

但这会重置权限。稍微详细一点的版本:

git show HEAD:./file.xml > ./file.xml

仅重置内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接