是什么原因导致git的接收后umask与用户的umask不同?

时间:2016-08-06 06:27:10

标签: git gitolite umask

经过一些挖掘和帮助from other people后,我发现我在git中遇到umask设置问题。我想要实现的是在我的服务器上检出的任何git仓库,umask设置默认为0002.我不想在每个post-receive钩子中配置它。 ..我希望这是默认的umask。我如何实现这一目标?

通过使用服务器上的git用户登录ssh来上载我的存储库。当我检查umask设置时,这已经设置为正确的设置:

root@server:~# su git 
git@server:~$ umask
0002

但是,如果我将umask > /tmp/debug.log放在我的post-receive挂钩中,那么该文件会显示umask 0077!是什么导致这种情况有所不同?

根服务器也具有相同的umask,当我签出存储库时,我无法弄清楚为什么umask不同。如果我更改为git用户并创建文件,那么一切正常:

git@server:~$ touch newfile
git@server:~$ ls -la
total 8
-rw-rw-r-- 1 git git    0 Aug  6 02:17 newfile
-rw------- 1 git git    0 Aug  6 02:16 post

newfile是我刚创建的文件,post文件是我通过git检出的文件,显然具有不同的权限。我还将umask添加到git用户的.bashrc中,但无济于事:

git@server:~$ cat ~/.bashrc 
export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LC_TYPE="en_US.UTF-8"
umask 0002

为了它的价值,我使用gitolite来管理我的存储库。

这是我使用的示例后接收钩子脚本:

#!/bin/sh
export GIT_WORK_TREE=/home/user/www/
git checkout -f

2 个答案:

答案 0 :(得分:2)

在非交互模式下,从post-receive挂钩调用时,您需要找到shell使用的启动脚本。

如果你的钩子脚本以#!/bin/sh开头, 然后查看man sh并查找有关.profile/etc/profile.bashrc或类似内容的rcfiles的提及。所使用的shell的手册页应该解释在交互式和非交互式shell的情况下源文件。您正在寻找非交互模式下使用的文件。

如果手册页中仍然不清楚, 您可以找到使用/bin/sh的{​​{1}}链接,并使用namei /bin/sh运行该命令。

要验证您从启动顺序中使用的脚本中理解的内容, 您可以在可疑脚本文件中添加一些调试行,例如:

--help

然后触发post-receive hook并查看{ echo this is file x; umask; } >> /tmp/debug.log

答案 1 :(得分:2)

事实证明确实我正在使用gitolite。为什么?因为gitolite配置中有一个设置指示新文件的umask。奇怪的是,我从来没有在以前的gitolite安装中更改此设置,但可能默认已更改。无论如何,这是我最终如何解决它:

打开~/.gitolite.rc文件:

找到这一行:

$REPO_UMASK = 0077;

并将其更改为选择设置,例如:

$REPO_UMASK = 0002;

之后事情终于奏效了!