git diff显示文件权限异常:实际775权限显示为755
问题根因
这不是Git的显示错误,是Git本身的权限跟踪设计决定的:Git不会完整存储Unix文件系统的全量权限位,仅对文件的可执行权限位做版本跟踪,内部只维护两种文件模式值:
- 非可执行普通文件:存储值为
100644,对应常规644权限 - 可执行文件:存储值为
100755,对应常规755权限
你本地给文件设置的775权限中,组写、其他用户写这两个权限位完全不在Git的跟踪范围内,Git只要检测到文件开启了可执行位,就会统一按内置存储的755模式展示diff结果,自然和你用系统命令查到的775实际权限不一致。
更换系统后才出现权限diff的原因
Git是否扫描文件权限差异由core.filemode配置项控制:
- 在Ubuntu 22.04这类原生Linux系统上,如果仓库存放在ext4等原生支持Unix权限的文件系统中,该配置默认值为
true,Git会自动对比工作区文件的可执行位和仓库内存储的权限值,存在差异就会展示在diff中 - 如果你之前使用的系统是Windows、旧版WSL,或者仓库存放在NTFS/FAT等不原生支持Unix权限的文件系统上,Git会自动将该配置设为
false,直接忽略所有权限类变更,自然不会出现相关diff记录。
处理方案
根据自己的需求二选一即可:
- 不需要Git跟踪任何文件权限变更的话,直接在仓库根目录执行以下命令关闭检测,后续所有权限变化都不会出现在diff结果中:
git config core.filemode false
- 仓库内存在脚本等需要保留可执行位跟踪的文件时,无需处理这个显示差异:你本地给文件配置的775里的额外写权限属于本地环境配置,不会被Git提交到远程仓库,也不会影响其他协作者拉取代码后的正常使用。
可以自行验证逻辑:对任意775权限的跟踪文件执行
git ls-files --stage <文件路径>,就能看到Git实际存储的该文件模式固定为100755,和本地额外配置的组/其他用户写权限没有关系。
内容的提问来源于stack exchange,提问作者GLK
相关产品推荐
相关产品推荐

