一、问题现象

在服务器环境中,执行 git pull 更新程序代码后,发现部分文件权限发生变化。

例如:

更新前:

执行:

后:

部分文件权限变为:

但并非所有文件都会变化,只有部分更新过的文件出现权限变化。

二、问题分析

1. Git权限管理机制

Git 本身不会保存完整 Linux 文件权限信息,只记录:

普通文件:

可执行文件:

Git 不记录:

等详细权限。

因此,执行 git pull 时:

  • 未发生变化的文件 → 保留原权限
  • 需要重新 checkout 的文件 → 根据当前系统创建规则重新生成权限

所以出现:

部分文件权限变化,部分文件不变化

2. 操作系统 umask 配置导致权限变化

检查服务器当前 umask:

发现:

表示系统默认创建文件时采用严格权限策略。

Linux 文件默认权限计算:

普通文件:

目录:

因此 Git 在重新生成文件时:

文件权限:

目录权限:

三、问题定位过程

1. 查看当前用户 umask

执行:

结果:

表示系统采用严格权限策略。

2. 查找 umask 配置来源

不同操作系统版本配置位置可能不同,需要逐项检查。

方法一:检查系统默认配置

可能存在:

方法二:检查用户环境配置

可能存在:

方法三:检查 PAM 配置

部分系统通过 PAM 设置:

如果存在:

说明登录时会加载 umask 策略。

进一步检查:

(部分系统不存在)

方法四:检查用户自身配置

检查:

是否存在:

四、处理方法

方案一:针对部署用户调整(推荐)

不修改系统全局安全策略。

在当前用户环境

编辑:

在文件最后增加:

重新登录后验证:

正常结果:

方案二:修改系统默认策略

根据服务器安全要求调整。

例如:

修改:

中的:

调整为:

注意:

可能影响系统安全策略;
等保、环境修改前需要确认。

五、注意事项

不同国产操作系统版本配置位置可能不同;
安全加固后的服务器可能强制设置 umask=077;
不建议直接执行:

作为长期解决方案。

生产环境建议:

目录:

文件:

根据业务需要单独调整上传目录权限。