core.ignorecase是git在不区分大小写的文件系统(如windows ntfs、macos apfs)中控制是否忽略文件名大小写差异的关键配置,默认为true,导致纯大小写变更(如service.java→service.java)不被识别,需设为false并配合git rm --cached和git add刷新索引才能生效。

core.ignorecase 是 Git 在文件系统不区分大小写的环境下(比如 macOS 默认的 APFS 卷、Windows NTFS)用于控制是否“忽略文件名大小写差异”的关键配置。默认值为 true,这会导致 Git 无法识别 Service.java → service.java 这类纯大小写变更,进而 push 不生效、status 不显示、diff 看不到——不是 Git 坏了,是它被“骗”了。
为什么改了文件名 Git 却不认?
根本原因是:Git 的索引(index)和工作目录的文件系统行为不一致。macOS 和 Windows 的文件系统本身不区分 README.md 和 readme.md,Git 默认配合这种行为(core.ignorecase=true),于是当你重命名时,它认为“还是同一个文件”,跳过记录变更。
- 现象包括:
git status无输出、git diff为空、git add失败或静默忽略 - 常见于重构时统一命名规范(如把
controller改成Controller)、跨平台协作(Linux 开发者提交了大小写变更,Windows/macOS 同事拉取后无法检出) - 注意:
core.ignorecase是运行时行为控制,不影响已提交的历史;它只影响新发生的文件操作
如何正确设置 core.ignorecase = false
必须用布尔值 false(不能写 off、no 或空字符串),且推荐在项目级设置而非全局——因为不同项目可能依赖不同文件系统语义。
- 进入项目根目录后执行:
git config core.ignorecase false - 验证是否生效:
git config --get core.ignorecase应输出false - 如果之前已有大小写冲突的文件(比如同时存在
A.txt和a.txt),先手动清理再设配置,否则 Git 会报错并拒绝操作 - 设置后需强制刷新索引:
git rm -r --cached . && git add .(慎用,确保工作区干净;也可只对具体文件操作:git rm --cached OldName.java && git add newname.java)
设置后仍不生效的典型原因
不是配置没写对,而是 Git 已缓存旧状态,或操作系统层有干扰。
-
git status还是看不到变化?运行git update-index --refresh强制比对工作区与索引 - 重命名后文件在 Finder/Explorer 中消失了?那是文件系统覆盖导致,不是 Git 问题;建议先
git mv OldName.java newname.java而非直接在 GUI 里拖拽改名 - 使用 VS Code 或 IDE 提交时没反应?检查是否启用了“自动暂存更改”或“Git 集成缓存”,重启 IDE 或禁用相关插件再试
- CI 流水线失败?确认 CI 环境(如 Linux runner)也设置了对应配置,或统一用
git mv提交变更,避免依赖core.ignorecase
core.ignorecase,后续所有重命名都走 git mv,别碰文件管理器里的重命名功能。











