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

Tom*_*aws 5 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
Run Code Online (Sandbox Code Playgroud)

要么

git diff -p
Run Code Online (Sandbox Code Playgroud)

它没有任何表现.

在我的本地存储库中,权限是755,文件全部由haws拥有.在我的生产存储库中,所有其他权限保持在755,并且包括contact.php在内的所有文件都归我的用户名所有.

在本地和生产存储库中,我更改了core.filemode,试图阻止此行为,

core.filemode = false
Run Code Online (Sandbox Code Playgroud)

我在合作项目中遇到过这样的谜团,所以我真的很想了解发生了什么.

  1. 我该怎么做才能看到git更改此文件权限的原因?
  2. 我怎么能让git停止改变呢?

我也尝试在这里找到解决方案:防止Git更改权限拉取无效.

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

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

    umask 0022

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

umask u=a,g-w,o-w 
Run Code Online (Sandbox Code Playgroud)

要么

umask u=a,go-w 
Run Code Online (Sandbox Code Playgroud)

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

这解决了我的问题.

  1. 我以前设置git config core.sharedRepository为true,但这不是我的问题,一旦问题解决,我就删除了设置.

Von*_*onC 8

正如" 在钩子中使用git pull时错误的文件权限 "中所述

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

在你的情况下:umask 0022应该在你拉动时设置.
(这就是我在你看到的答案中提到的" 防止Git改变拉动权限 ")

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

git config core.sharedRepository true
Run Code Online (Sandbox Code Playgroud)

" 我如何在一台机器上与多个用户共享一个Git存储库? "中提到了另一个解决方案,在这里你需要确保像这样初始化一个repo:

git init --shared=0022
Run Code Online (Sandbox Code Playgroud)

OP Tom Haws在评论中补充道:

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

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

要了解如何umask设置(系统范围或用户范围),请参阅" 如何设置系统范围umask "

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

umask
Run Code Online (Sandbox Code Playgroud)