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

2024-03-30

我是唯一参与这个 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

or

git diff -p

它什么也没显示。

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

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

core.filemode = false

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

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

我也尝试在这里找到解决方案:防止 Git 更改拉取权限 https://stackoverflow.com/questions/12733452/prevent-git-from-changing-permissions-on-pull无济于事。

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

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

    掩码0022

或使用符号表示法(以获得一点附加值)

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

or

umask u=a,go-w 

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

这解决了我的问题。

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

正如《在钩子中使用 git pull 时文件权限错误 https://stackoverflow.com/a/5443141/6309"

Git不存储权限,除了可执行位之外.
因此,在结帐时,将使用默认权限创建文件,这取决于您的umask http://en.wikipedia.org/wiki/Umask.

在你的情况下:umask 0022应该在拉动时设置。
(这就是我在你看到的答案中提到的“防止 Git 更改拉取权限 https://stackoverflow.com/a/12735291/6309")

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

git config core.sharedRepository true

另一种解决方案在“如何与一台计算机上的多个用户共享 Git 存储库? https://serverfault.com/a/113688/783”,您需要确保引入像这样初始化的存储库:

git init --shared=0022

The OP Tom Haws https://stackoverflow.com/users/563114/tom-haws在评论中添加:

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

可能是因为 umask 默认设置为0022已经,这意味着,默认情况下,git shell 继承了umask系统的。
改变umask需要一个core.sharedRepository set to true考虑它而不是考虑umask父进程的。
那,或者因为回购是用创建的--shared=0022.

看看如何umask可以设置(系统范围或用户范围),请参阅“如何设置系统范围umask? https://stackoverflow.com/a/10221511/6309"

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

umask
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐