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

use*_*421 5 git permissions gitolite

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

#!/bin/sh
export GIT_WORK_TREE=/home/user/www/
git checkout -f
Run Code Online (Sandbox Code Playgroud)

但是,文件在结帐时获得了非常奇怪的600权限和文件夹700。这不是我所期望的(在我们的其他服务器上,我们得到644755)。从这个线程我了解到 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
Run Code Online (Sandbox Code Playgroud)

额外细节:

  • 服务器端和开发端都使用Linux
  • 在本地 repo 中,权限为 755 和 644
  • filemode 在 .git/config 中设置为 true

Sto*_*ica 2

然而,文件在签出时获得了非常奇怪的 600 权限,而文件夹则获得了 700 权限。

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

从这个线程我了解到 git 没有设置权限,所以 git 不应该受到责备。

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

我的问题是:[...][如何]我怎样才能找出这个问题的原因是什么?

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

您可以有非常严格的umask设置,但可以通过按照 @VonC 建议添加一行来在脚本中覆盖它们umask