如何让 Git 忽略文件权限(chmod)变化?
git config core.fileMode false 让 Git 不再跟踪文件的可执行位变化;可全局或单仓库设置。Windows/挂载共享目录环境必备。本文说明设置方法与注意事项。
一条命令:git config core.fileMode false(当前仓库)或 git config --global core.fileMode false(全局)。设置后 Git 不再把文件权限位(chmod +x 等可执行位)的变化视为修改,status/diff 不再被权限噪声刷屏。
什么时候需要
- Windows 环境:NTFS 没有 Unix 权限位,Git for Windows 常把文件误报为 mode 变化
- 跨系统共享目录:samba/NFS 挂载的代码目录权限被自动改写
- 服务器上直接改代码:部署过程中 umask/chmod 动了权限
设置方法
# 单仓库(推荐,影响面可控)
git config core.fileMode false
# 全局
git config --global core.fileMode false
# 验证
git config core.fileMode
注意事项
- 已有的权限变化不会自动消失:
git status里已显示的 mode 变化要先git checkout .或提交处理掉,新设置只管之后 - 可执行脚本的保护:core.fileMode false 后,给脚本加执行位不会被 Git 记录——团队成员 clone 后脚本可能不可执行,需文档说明或在构建里补 chmod
- 新文件不受影响:新文件首次提交时的 mode 按当时状态记录
已被 track 的文件要修权限记录
如果想把权限改回正确值并固化:
git ls-files -s | grep 100755 # 找已记录为可执行的文件
git update-index --chmod=+x deploy.sh # 显式更新索引中的权限位
git update-index --chmod 不受 core.fileMode 影响,可精确控制。
观测云对照
配置漂移也值得关注。 文件权限变化在生产环境常是人为操作或安全事件的痕迹;观测云对关键目录的变更类日志采集可作为审计补充。
常见问题(FAQ)
Q:设置后 git diff 还有 ^M 或内容变化?
A:那是换行符(CRLF)问题,不是权限问题——看 core.autocrlf 配置。
Q:团队仓库应该统一这个设置吗?
A:core.fileMode 是本地配置不入库;团队可在文档/onboarding 脚本里统一约定。
Q:Linux 纯环境建议关吗?
A:不建议。Linux 下文件执行位是有意义的状态(部署脚本就该可执行),保持默认 true。