4

在其他人的一些挖掘和帮助之后,我发现我umask在 git 中的设置有问题。我想要实现的是在我的服务器上签出的任何 git repo,umask设置默认为 0002。我不想在每个 post-receive 挂钩中配置它......我希望这是默认的umask. 我该如何做到这一点?

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

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

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

根服务器也有相同的,当我检查存储库时,我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
4

2 回答 2

2

所以事实证明,我使用 gitolite确实很重要。为什么?因为 gitolite 配置中有一个设置决定了新文件的 umask。奇怪的是,我在以前的 gitolite 安装中从未更改此设置,但也许默认值已更改。无论如何,这就是我最终整理出来的方式:

打开~/.gitolite.rc文件:

找到这一行:

$REPO_UMASK = 0077;

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

$REPO_UMASK = 0002;

后来事情终于奏效了!

于 2016-08-06T07:31:26.353 回答
2

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

如果您的钩子脚本以 开头#!/bin/sh,则查看man sh并查找提及 rcfile 之类的 、.profile或类似内容。使用的 shell 的手册页应说明交互式和非交互式 shell 的文件来源。您正在寻找在非交互模式下使用的文件。/etc/profile.bashrc

如果从手册页中仍然不清楚,您可以找到/bin/sh指向 usingnamei /bin/sh的链接,然后使用 运行命令--help

为了验证您对启动序列中使用的脚本的理解,您可以在可疑的脚本文件中添加一些调试行,例如:

{ echo this is file x; umask; } >> /tmp/debug.log

然后触发接收后挂钩并查看/tmp/debug.log.

于 2016-08-06T06:49:32.647 回答