如何让 Git 忽略文件权限(chmod)变化?

git config core.fileMode false 让 Git 不再跟踪文件的可执行位变化;可全局或单仓库设置。Windows/挂载共享目录环境必备。本文说明设置方法与注意事项。

最佳实践
如何让 Git 忽略文件权限(chmod)变化?封面

一条命令: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

注意事项

  1. 已有的权限变化不会自动消失git status 里已显示的 mode 变化要先 git checkout . 或提交处理掉,新设置只管之后
  2. 可执行脚本的保护:core.fileMode false 后,给脚本加执行位不会被 Git 记录——团队成员 clone 后脚本可能不可执行,需文档说明或在构建里补 chmod
  3. 新文件不受影响:新文件首次提交时的 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。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台