46

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

问题在于,Git 会更改它所签出的文件的所有权甚至文件权限,具体取决于进行签出的用户。这样做的直接结果是我们的 CSS 文件在结帐后变得不可读,因为 Git 将文件所有权更改为执行 Git 拉入 webroot 的人。

例子:

  • 之前git pullstyle.css拥有者user_a:group_a
  • 之后git pullstyle.css拥有者user_b:user_b

我想将所有权保留为user_a:group_a. 我不想每次我的团队中的一个人对文件进行更改并将所有权更改回原始配置时都必须登录。

其他人如何处理这个问题?您如何处理多个用户使用的存储库。我们的系统上有 suphp,无法将其关闭。

4

5 回答 5

41

Git 不会更改文件权限或所有权。只是它(大部分)也不存储它,它不存在于您的存储库中,因此它们会更改为您的用户拥有的任何内容。就像任何文件创建一样。

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

请参阅此线程-“如果您需要特定权限,则需要手动执行。”

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

就像@ikke 在评论中所说,Git 并不是真正的部署工具,不应该这样使用。它是源代码的版本控制系统。

于 2013-01-28T07:12:20.470 回答
15

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

.git/hooks/post-checkout:

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

顺便说一句,结帐并不是 git 弄乱权限的唯一情况,当你拉取时也是如此。我用.git/hooks/post-merge钩子处理。

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

#!/bin/sh
chmod a+x tools/fixpermissions.sh
tools/fixpermissions.sh
于 2013-08-15T12:45:13.767 回答
3

最简单的解决方案是将 git 作为user_a.

于 2013-01-28T07:53:15.927 回答
0

我经常跑一个

git checkout -f file.xml

...在具有世界写入权限的版本化file.xml上,因为我不断修改它并希望将其恢复到正常状态。

但这会重置权限。稍长的版本:

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

只是重置内容。

于 2014-03-28T19:00:42.503 回答
0

或者,您可以为相关文件夹设置默认权限,如下所示:https ://unix.stackexchange.com/questions/1314/how-to-set-default-file-permissions-for-all-folders-files-in -a-目录

于 2016-09-14T20:38:37.027 回答