使用git检出文件时如何找出导致文件权限更改的原因?

时间:2016-08-05 12:26:54

标签: git permissions gitolite

将文件推送到我们的服务器后,执行以下post-receive挂钩:

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

但是,文件在结帐时会获得非常奇怪的600权限和文件夹700。这不是我所期望的(在我们的其他服务器上,我们得到644755)。从this thread我明白git没有设置权限,所以git不应该受到责备。我的问题是:什么是?我怎样才能弄清楚这个问题的原因是什么?

我已经通过在结帐时运行额外的脚本来修复权限来暂时解决它,但我有兴趣解决根本原因。

我正在使用gitolite来管理存储库,但我怀疑这是原因。但同样,我很高兴知道我可以从哪里开始,因为此时我不确定如何调查这一点。

根据初步答案,我查看了服务器上的umask设置。 git用户(用户用来上传文件),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
  • filemode在.git / config
  • 中设置为true

2 个答案:

答案 0 :(得分:2)

在" Git change default umask when update file"中,您可以在钩子上添加umask吗?

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

应将文件权限设置为664,将目录权限设置为775。

具体针对 gitolite check the umask section of the gitolite.rc file

  

$UMASK,八进制,默认0077

     

gitolite使用的默认UMASK为所有回购及其内容提供rwx------权限。
  想要运行gitweb(或cgit,redmine等)的人意识到这不会做。

     

处理此问题的正确方法是为此变量赋予类似0027的值(请注意语法:需要前导0),然后让用户运行Web服务器(apache,www-data,无论如何)git' umask'基。

     

如果您已经安装了gitolite,则必须手动修复现有文件(对于0027chmod -R g+rX,即umask)。这是因为{{1}}仅影响对新创建文件的权限,而不影响现有文件的权限。

答案 1 :(得分:1)

  

但是,文件获得了非常奇怪的600权限,并且在结帐时获得了文件夹700.

看起来你的shell有一个限制性的umask设置,可能是umask 0177

  

从这个帖子我明白git没有设置权限,所以git不应该受到责备。

不,这是你的shell的umask设置。

  

我的问题是:[...] [如何]我能弄清楚这个问题的原因是什么?

运行umask,它会告诉您当前的设置是什么。这就像是0177或类似的。 如果你想知道为什么, 你需要查看/bin/sh使用的rc文件, 最有可能是.profile.bashrc,以及其他来源的文件。

您可以设置非常严格的umask设置,但可以在脚本中覆盖它们,方法是添加{@ 1}}行作为@VonC建议。