目录
是否可以设置core.ignorecase=false(禁止)
背景
从远程拉取test到本地,再切换到test分支
git branch test --track origin/test
git checkout test
用git status查看test分支的工作状态时,出现未暂存提交的代码修改,如下图:
好奇为啥会出现这种情况,查看idea项目和本地的目录文件内容,如下:
有点懵,再查看最近同事提交的test分支代码,发现他在同个包下面push上了两个类AlipaySPIService.java 和 AlipaySpiService.java,看着两个类是可以通过大小写进行区分的。
然后更离谱的是,git add . 和git checkout -- . 命令执行都没有效果,如下图:
后续剧情
同事将AlipaySPIService.java 类删除,push到远程test分支。
我这边重新克隆项目,进行拉取远程test分支代码,这样就恢复正常使用。
真相
不能就这样不清不楚地结束剧情,化身狄仁杰,根据现象进行抽丝剥茧,探索其真相。
看着跟文件名大小写有关系。
针对文件/文件夹,Windows 系统和 Mac 系统是不区分大小写的, Linux 系统是区分大小写的。
Git 默认是不区分大小写的,这种行为是由其 core.ignorecase
这个设置项控制的。而在 Windows 和 macOS 这两种不区分文件名大小写的系统上 core.ignorecase
的默认值为 true
。
Manka@DESKTOP-FVUJUND ~/upay
$ git config --list
core.ignorecase=true
所以,同事的办公环境是linux系统,因此不受影响。
我这边的办公环境是windows系统,代码上的提交用的是cgywin软件(是在Windows环境下,来模拟在UNIX/Linux环境下编程)
是否可以设置core.ignorecase=false(禁止)
情况1 :分支存在同目录下两个同名但字母大小写不一样的文件
先设置git config core.ignorecase false, 直接拉取 windows文件系统依旧显示只有小写的文件名。
git上线显示为小写文件名的文件,文件内容是小写文件名的文件,git status记录显示我们将大写的文件名改成小写的文件名,内容也修改成小写的文件名了,进行提交,gitlab系统上会存在同目录下两个同名但大小字母不一样的文件, 内容都是以小写文件名的内容。
情况2 :修改文件名大小写
假设windows系统里现在有一个文件为 testFile,将其重命名为 TESTFile,这个时候 Git 不会显示任何文件变化,因为 Git 默认忽略文件名大小写变化嘛。
好的,现在设置 Git core.ignorecase=false配置,如果将这个修改进行 commit 并且也 push 了,那么远程仓库现在就会同时有 testFile 和 TESTFile两个文件。
补充
之前也遇到过这种场景:
同事在linux环境将GateWay改成Gateway文件名,并推送到远端master分支。
我这边用windows环境的linux子系统(wsl是能区分文件大小写的)拉取master分支代码时,出现编译正常,但是idea一直显示报错,idea上显示文件名为GateWay, 但windows目前显示的文件为Gateway文件名。
后续解决办法:
执行Invalidate Caches/ Restart, idea重新加载项目,恢复正常。