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

git config core.fileMode false 让 Git 忽略工作区可执行位差异,不撤销已暂存的 mode 变化;可全局或单仓库设置。适用于无法可靠表达执行位的文件系统或挂载环境。本文说明设置方法与注意事项。

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

一条命令:git config core.fileMode false(当前仓库)或 git config --global core.fileMode false(全局)。设置后 Git 不再根据工作区执行位判断 mode 差异;它并不跟踪完整 Unix 属主、ACL 或全部 chmod 权限。Git 不再把执行位(chmod +x 等可执行位)的变化视为修改,status/diff 不再被权限噪声刷屏。

什么时候需要

  • Windows 环境:文件系统/挂载层可能无法可靠表达 Unix 执行位,Git 会探测并设置该配置,不能一概认为 Windows 总误报
  • 跨系统共享目录:samba/NFS 挂载的代码目录权限被自动改写
  • 服务器上直接改代码:部署过程中 umask/chmod 动了权限

设置方法

# 单仓库(推荐,影响面可控)
git config core.fileMode false

# 全局
git config --global core.fileMode false

# 验证
git config core.fileMode

注意事项

  1. 已有未暂存的执行位差异可立即不再显示:不需要 checkout 丢弃内容;已写入索引的 mode 变化不会因此撤销
  2. 可执行脚本的保护:core.fileMode false 后,给脚本加执行位不会被 Git 记录——团队成员 clone 后脚本可能不可执行,需文档说明或在构建里补 chmod
  3. 新文件也受影响:core.fileMode=false 时,新可执行文件可能按 100644 暂存;需用 update-index --chmod 显式记录

已被 track 的文件要修权限记录

如果想把权限改回正确值并固化:

git ls-files -s | grep 100755    # 找已记录为可执行的文件
git update-index --chmod=+x deploy.sh   # 显式更新索引中的权限位

git update-index --chmod 不受 core.fileMode 影响,可精确控制索引;检查 git diff --cached 后提交,才会把执行位写入版本历史。

常见问题(FAQ)

Q:设置后 git diff 还有 ^M 或内容变化?
A:那是换行符(CRLF)问题,不是权限问题——看 core.autocrlf 配置。

Q:团队仓库应该统一这个设置吗?
A:core.fileMode 是本地配置不入库;团队可在文档/onboarding 脚本里统一约定。

Q:Linux 纯环境建议关吗?
A:不建议。Linux 下文件执行位是有意义的状态(部署脚本就该可执行),保持默认 true。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台