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

Git无法解释地更改单个文件的权限,git,file-permissions,chmod,Git,File Permissions,Chmod,我是唯一参与这个git项目的人。每次我在本地Ubuntu存储库编辑文件,然后推到Bitbucket并拉到我的生产存储库,git都会将编辑的文件更改为-rwxr-x 775。Apache不喜欢这样 本地系统:Ubuntu Linux上的git版本1.8.1.2 生产系统:CentOS/Red Hat Linux上的git版本1.7.12 当我将权限修改为755时,请执行以下操作 git diff 或 什么也看不出来 在我的本地存储库中,权限为755,文件全部归haws所有。 在我的生产存储库中,

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

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

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

当我将权限修改为755时,请执行以下操作

git diff

什么也看不出来

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

在本地存储库和生产存储库中,我对core.filemode进行了如下更改,以尝试停止此行为

core.filemode = false
我在合作项目中遇到过这样的神秘事件,所以我真的很想了解发生了什么

  • 我可以做什么来查看git更改此文件权限的原因
  • 我怎样才能让git停止更改它
  • 我也试图在这里找到解决办法:没有用

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

  • 多亏了VonC的精彩解释,我才勇敢地发现,每次登录服务器时,我的umask都会回到0002。因此,我在Linux主机上创建了一个用户启动脚本(.bashrc或在我的例子中是.bash_profile),用于设置

    乌马斯克0022

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

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

    这解决了我的问题

  • 我以前将git config core.sharedepository设置为true,但这不是我的问题,问题解决后我删除了该设置 如“”中所述

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

    在您的情况下:
    umask 0022
    应在牵引时设置。
    (这就是我在你看到的答案中提到的“”)

    这假设您在目标回购协议中有如下配置:

    git config core.sharedRepository true
    
    在“”中提到了另一种解决方案,在该解决方案中,您将确保按如下方式初始化回购:

    git init --shared=0022
    

    OP在评论中添加了以下内容:


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

    可能是因为umask默认设置为
    0022
    ,这意味着默认情况下,git shell继承系统的
    umask

    更改
    umask
    需要将
    core.sharedRepository
    设置为
    true
    以将其考虑在内,而不是考虑父进程的
    umask

    或者因为回购协议是使用
    --shared=0022
    创建的

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

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

    umask
    

    请参阅2009年10月16日的评论,这可能与将文件添加到工作树的方式有关(git add.vs git commit-a),将core.filemode改为false可能不是一个好的解决方法。也许这也是一个不错的标准工作流程实践。不过,我还是想知道为什么git没有“像广告宣传的那样工作”。我忽略了什么?我建议提及您的操作系统和git版本,以获得更好、更清晰的答案。关于windows和非windows系统,这里存在差异。谢谢。按照你的建议做。有关更多信息,请参见问题。1。我把umask设置为0022。我怎么知道git在拉动时没有改变呢。我添加了git config core.sharedepository true。这解决了我的问题。我会读到这篇文章。谢谢我接受你的回答,希望你能和我在这件事上多坚持一会儿,帮助我理解正在发生的事情。我仍然感到困惑的原因是我不明白sharedRepository在这种情况下是如何应用的。是因为“haws”在我的本地服务器上拥有这些文件,而“jconstru”在生产服务器上拥有它们吗?我还是不明白。为什么这在我的客户的项目中不是一个问题,那里有三个开发人员都有本地Ubuntu存储库推拉,我的umask有0022,生产服务器上的git config只说[core]repositoryformatversion=0 filemode=true bare=false logallrefupdates=true@TomHaws其思想是,如果
    core.sharedepository
    设置为true,那么在拉取时git将尊重
    umask
    。git不会更改umask(但如果
    core.sharedRepository
    设置为
    false
    或根本没有设置,它可以忽略它)。您知道为什么我客户端的生产服务器上的git能够在没有文件权限更改的情况下进行拉取,即使存储库的配置中没有sharedRepository条目?
    git config core.sharedRepository true
    
    git init --shared=0022
    
    umask