5

我是唯一参与这个 git 项目的人。每次我在本地 Ubuntu 存储库中编辑文件,然后推送到 Bitbucket 并拉到我的生产存储库时,git 都会将编辑的文件更改为 -rwxrwxr-x 775。Apache 不喜欢这样。

本地系统:Ubuntu Linux 上的 git 版本 1.8.1.2

生产系统:CentOS/Red Hat Linux 上的 git 版本 1.7.12

当我将权限修复为 755 时,请执行

git diff

或者

git diff -p

它什么也没显示。

在我的本地存储库中,权限为 755,文件均归 haws 所有。在我的生产存储库中,所有其他权限都保持在 755,并且所有文件(包括 contact.php)都归我的用户名所有。

在本地和生产存储库中,我按如下方式更改了 core.filemode 以试图阻止这种行为,

core.filemode = false

我在合作项目中遇到过这样的谜团,所以我真的很想了解正在发生的事情。

  1. 如何查看 git 更改此文件权限的原因?
  2. 我怎样才能让 git 停止更改它?

我也试图在这里找到解决方案:防止 Git 更改 pull 时的权限无济于事。

我的最终解决方案(感谢 VonC 的指导):

  1. 多亏了 VonC 的出色解释,我才勇敢地发现每次登录服务器时,我的 umask 都会回到 0002。所以我在我的设置的 Linux 主机

    掩码 0022

或使用符号表示法(为了一点附加值)

umask u=a,g-w,o-w 

或者

umask u=a,go-w 

(允许用户的所有权限,不允许组和其他人的写权限)

这解决了我的问题。

  1. 我之前已将 git config core.sharedRepository 设置为 true,但这不是我的问题,一旦问题得到解决,我就删除了该设置。
4

1 回答 1

8

如“在挂钩中使用 git pull 时文件权限错误”中所述

Git 不存储权限,除了可执行位
因此,在结帐时,将使用默认权限创建文件,这取决于您的umask

在您的情况下:umask 0022应在拉动时设置。
(这就是我在您看到的“阻止 Git 更改拉取权限”的答案中提到的)

这假设您在目标存储库中具有如下配置:

git config core.sharedRepository true

另一个解决方案在“我如何与一台机器上的多个用户共享一个 Git 存储库? ”中提到,您将确保拉入一个像这样初始化的存储库:

git init --shared=0022

OP Tom Haws在评论中补充道:

你知道为什么我的客户生产服务器上的 git 能够在没有文件权限更改的情况下进行拉取,即使sharedRepository该存储库的配置中没有条目?

可能是因为 umask 默认设置为0022already,这意味着默认情况下,git shell 继承umask了系统的。
更改umask需要core.sharedRepository设置以true将其考虑在内,而不是考虑umask父进程。
那,或者因为 repo 是用--shared=0022.

要查看如何umask设置(系统范围或用户范围),请参阅“如何设置系统范围umask

要检查umaskgit 命令(将继承其值)之前的一个,只需键入:

umask
于 2013-08-27T05:31:49.247 回答