经过一些挖掘和帮助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
答案 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;
之后事情终于奏效了!