Git 更新后文件权限异常变更问题处理记录(umask)
一、问题现象
在服务器环境中,执行 git pull 更新程序代码后,发现部分文件权限发生变化。
例如:
更新前:
|
1 2 |
-rwxr-xr-x index.php -rw-r--r-- config.php |
执行:
|
1 |
git pull |
后:
|
1 |
-rw------- config.php |
部分文件权限变为:
|
1 |
600 |
但并非所有文件都会变化,只有部分更新过的文件出现权限变化。
二、问题分析
1. Git权限管理机制
Git 本身不会保存完整 Linux 文件权限信息,只记录:
普通文件:
|
1 |
100644 |
可执行文件:
|
1 |
100755 |
Git 不记录:
|
1 2 3 |
600 640 664 |
等详细权限。
因此,执行 git pull 时:
- 未发生变化的文件 → 保留原权限
- 需要重新 checkout 的文件 → 根据当前系统创建规则重新生成权限
所以出现:
部分文件权限变化,部分文件不变化
2. 操作系统 umask 配置导致权限变化
检查服务器当前 umask:
|
1 |
umask |
发现:
|
1 |
0077 |
表示系统默认创建文件时采用严格权限策略。
Linux 文件默认权限计算:
普通文件:
|
1 |
默认权限 666 - umask 077 = 600 |
目录:
|
1 |
默认权限 777 - umask 077 = 700 |
因此 Git 在重新生成文件时:
文件权限:
|
1 |
-rw------- |
目录权限:
|
1 |
drwx------ |
三、问题定位过程
1. 查看当前用户 umask
执行:
|
1 |
umask |
结果:
|
1 |
0077 |
表示系统采用严格权限策略。
2. 查找 umask 配置来源
不同操作系统版本配置位置可能不同,需要逐项检查。
方法一:检查系统默认配置
|
1 |
grep -i "UMASK" /etc/login.defs |
可能存在:
|
1 |
UMASK 077 |
方法二:检查用户环境配置
|
1 |
grep -R "umask" /etc/profile /etc/bashrc /etc/profile.d/ |
可能存在:
|
1 |
umask 077 |
方法三:检查 PAM 配置
部分系统通过 PAM 设置:
|
1 |
grep -R "pam_umask" /etc/pam.d/ |
如果存在:
|
1 |
session optional pam_umask.so |
说明登录时会加载 umask 策略。
进一步检查:
|
1 |
/etc/security/pam_umask.conf |
(部分系统不存在)
方法四:检查用户自身配置
检查:
|
1 2 3 |
# ~/.bash_profile # ~/.bashrc grep -R "umask" ~/.bash_profile ~/.bashrc |
是否存在:
|
1 |
umask 077 |
四、处理方法
方案一:针对部署用户调整(推荐)
不修改系统全局安全策略。
在当前用户环境
编辑:
|
1 |
vim ~/.bashrc |
在文件最后增加:
|
1 |
umask 022 |
重新登录后验证:
|
1 |
umask |
正常结果:
|
1 2 3 |
0022 # 或者 022 |
方案二:修改系统默认策略
根据服务器安全要求调整。
例如:
修改:
|
1 |
/etc/login.defs |
中的:
|
1 |
UMASK 077 |
调整为:
|
1 |
UMASK 022 |
注意:
可能影响系统安全策略;
等保、环境修改前需要确认。
五、注意事项
不同国产操作系统版本配置位置可能不同;
安全加固后的服务器可能强制设置 umask=077;
不建议直接执行:
|
1 |
chmod -R 777 |
作为长期解决方案。
生产环境建议:
目录:
|
1 |
755 |
文件:
|
1 |
644 |
根据业务需要单独调整上传目录权限。