将文件推送到我们的服务器后,将执行以下 post-receive 挂钩:
#!/bin/sh
export GIT_WORK_TREE=/home/user/www/
git checkout -f
然而,文件变得非常奇怪600
权限和文件夹700
结账时。这不是我所期望的(在我们的其他服务器上我们得到644
and 755
). From 这个线程 https://stackoverflow.com/questions/14557106/git-changes-my-file-permissions-upon-checkout我知道git没有设置权限,所以git不应该受到指责。我的问题是:什么是?我怎样才能找出这个问题的原因是什么?
我已经通过在结账时运行额外的脚本来修复权限来暂时解决了这个问题,但我有兴趣解决根本原因。
我正在使用 gitolite 来管理存储库,但我怀疑这就是原因。但同样,我很高兴知道我可以从哪里开始,因为此时我不确定如何调查这个问题。
根据最初的答案,我研究了服务器上的 umask 设置。这git
user(即用于上传文件的用户),umask 设置为 0002。这在以下练习中得到确认:
git@server:~$ umask
0002
git@server:~$ touch newfile
git@server:~$ ls -la newfile
-rw-rw-r-- 1 git git 0 Aug 5 10:46 newfile
额外细节:
- 服务器端和开发端均使用Linux
- 在本地仓库中,权限是755和644
- 文件模式在 .git/config 中设置为 true
As in "Git 更新文件时更改默认 umask https://stackoverflow.com/a/25441170/6309“,你可以将 umask 添加到你的钩子中吗?
#!/bin/sh
umask 002
export GIT_WORK_TREE=/home/user/www/
git checkout -f
这应该将文件权限设置为 664,将目录权限设置为 775。
关于gitolite具体来说,检查umask的部分gitolite.rc file http://gitolite.com/gitolite/gitolite.html#rc:
$UMASK
, 八进制, 默认0077
gitolite 使用的默认 UMASK 给出rwx------
对所有存储库及其内容的权限。
想要运行 gitweb(或 cgit、redmine 等)的人意识到这是行不通的。
处理这个问题的正确方法是给这个变量一个像这样的值0027
(注意语法:前导 0 是必需的),然后使运行 Web 服务器(apache、www-data 等)的用户成为 'git
' group.
如果您已经安装了 gitolite,则必须手动修复现有文件(对于umask
or 0027
,那就是chmod -R g+rX
)。这是因为umask
只影响新创建文件的权限,不影响现有文件的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)