Windows环境下Git切换拉取合并分支时文件名大小写异常问题咨询
Git切换分支文件名全小写问题成因分析
底层基础逻辑
Windows系统默认使用的NTFS文件系统属于大小写保留但不敏感类型:写入文件时会保留文件名的大小写格式,但文件路径匹配、读取操作时不区分大小写差异。Git的core.ignorecase配置仅用于调整Git对比本地文件与索引时的校验逻辑,不会主动修正本地磁盘上的文件名大小写,调整该参数无法解决写入环节产生的大小写异常。
异常触发路径
- 克隆master分支时,Git会按照仓库存储的元数据,将带正确大小写的文件写入本地磁盘,同时本地Git索引也会同步保存正确的文件名大小写记录
- 切换到DEV分支时,Git会先比对两个分支的文件差异:
- 内容无差异的文件不会触发磁盘写入操作,直接复用现有本地文件,文件名大小写保持正常
- 内容有差异的文件会触发删除旧文件、写入新文件的操作,旧版本Git for Windows的路径缓存逻辑存在bug,增量写入差异文件时会丢失大小写信息,直接将文件名转为全小写后写入磁盘
- 由于Windows文件系统不区分大小写,Git后续校验文件时不会判定全小写的文件名和索引中记录的正确大小写存在冲突,因此不会主动修正文件名。即使切回master分支,已被写入为全小写的文件也不会被触发重写,异常状态会保留。
其他异常特征解释
- 直接克隆DEV分支时不存在跨分支差异比对、增量写入的步骤,Git会全量按照仓库元数据写入所有文件,路径缓存bug不会被触发,因此文件名大小写正常
git ls-tree查询的是仓库存储的元数据,该部分内容本身是大小写敏感的,始终保存正确的文件名记录,因此查询结果无异常
修复方案
- 临时修复:执行
git rm -r --cached .清空本地索引缓存,再执行git reset --hard HEAD让Git按照当前分支的元数据重新写入所有文件,即可恢复正确的文件名大小写 - 永久修复:升级到最新版Git for Windows,该路径缓存导致的大小写写入bug已在后续版本中被修复
内容的提问来源于stack exchange,提问作者JayLee21
相关产品推荐
相关产品推荐

