Git无法解释地更改单个文件的权限

时间:2013-05-23 16:42:56

标签: git file-permissions chmod

我是唯一参与此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停止更改?
  3. 我也尝试在这里找到解决方案:Prevent Git from changing permissions on pull无济于事。

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

    1. 感谢VonC的好解释,我很勇敢地发现每次登录我的服务器时,我的umask都会回到0002.所以我创建了一个用户启动脚本(.bashrc或者我的case .bash_profile)在我的Linux主机上设置

      umask 0022

    2. 或使用符号表示法(稍微增加值)

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

      umask u=a,go-w 
      

      (允许用户拥有所有权限,禁止群组和其他人的写权限)

      这解决了我的问题。

      1. 我之前已经将git config core.sharedRepository设置为true,但这不是我的问题,我在问题解决后删除了该设置。

1 个答案:

答案 0 :(得分:8)

如“Wrong file permission when using git pull in a hook

中所述
  

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

在你的情况下:当你拉动时应该设置umask 0022 (这就是我在答案中提到的“Prevent Git from changing permissions on pull”)

这假设您在目标仓库中具有以下配置:

git config core.sharedRepository true

How do I share a Git repository with multiple users on a machine?”中提到了另一个解决方案,您可以确保在其中引入一个初始化的repo:

git init --shared=0022

OP Tom Haws在评论中添加:

  

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

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

要了解如何设置umask(系统范围或用户范围),请参阅“How to set system wide umask?

要在git命令(将继承其值)之前检查umask,只需输入:

umask