Git在结账时更改我的文件权限

时间:2013-01-28 07:08:45

标签: git

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

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

示例:

  • git pull之前style.css所拥有的user_a:group_a
  • git pull
  • 拥有的style.cssuser_b:user_b之后

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

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

6 个答案:

答案 0 :(得分:36)

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

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

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

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

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

答案 1 :(得分:12)

对我来说,最好的解决方案是创建一个修复权限的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

答案 2 :(得分:3)

最简单的解决方案是将git作为user_a运行。

答案 3 :(得分:3)

问题的一个可能解决方案可能是:Retaining file permissions with Git

它对我有用,所以你可以尝试看看它对你有用。

答案 4 :(得分:0)

我经常跑

git checkout -f file.xml

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

但是这会重置权限。版本略长:

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

只需重置内容。

答案 5 :(得分:0)