Git系列之再度踩坑文件名大小写问题
背景
某次代码提交后,测试扔过来一个构建失败的链接,整个页面上百行都是红的。大致扫了眼,都是一些cannot find symbol
的报错,而且都是在POJO类上面,而这些类本地代码看下来没有任何毛病。在POJO的定义上有使用lombok,但是这不是第一次构建,显然与lombok无关:
遂,让测试重新构建。
谁知道,过了一会儿,依旧构建失败。此时才观察到导致构建失败的真正报错原因(上图):
error class GetAdsetDataJob is public, shoule be declared in a file named GetAdsetDataJob.java
遗留问题:为什么Jenkins构建失败,会打印出一大堆(上百行不夸张)乱七八糟(跟根本问题毫无瓜葛)的报错日志,干扰视听呢???
看到上面这个报错,确实是刚提交的调整文件大小写,排查有了方向。
但是我本地确确实实启动正常,git push
也是成功的。为啥Jenkins构建失败?
又是一番丈二和尚摸不着头脑。抱着试一试的心态,打开GitLab server,浏览服务器文件目录:
还真一不小心发现问题(其实没有那么容易):GitLab服务端存在两个文件,一个大写开头,一个小写开头。
遗留问题:如上图,分明有改过三个文件的大小写,可是为啥只有一个文件导致后续的各种麻烦???印象中,三次提交没区别啊
解决方法就很简单:删除小写开头的。
怎么删?
- 最快速的方法,当时是直接在服务端删除,前提是需要有master权限;
- 客户端提交?可客户端明明已经push成功过的
鉴于我恰好有master权限,选择第一种。
以为万事大吉。大错特错。
后续工作中,无论是切换分支,还是拉取远端更新,都还是有报错。
切换分支:
git checkout dev_wj
error: The following untracked working tree files would be overwritten by checkout:
octopus-backend/src/main/java/com/aaa/cbd/platform/job/facebook/getAccountDataJob.java
.....省略更多
Please move or remove them before you switch branches.
Aborting
解决方法,强制切换分支:git checkout -f dev_wj
更新分支:
git pull origin dev_wj
或直接git pull
,也是报如上类似错误;尝试加上-f
强制拉取参数:
awesome-me@PPC-0202000118 MINGW64 /d/code/cbd-platform/octopus-backend (dev_wj)
$ git pull -f
error: The following untracked working tree files would be overwritten by merge:
octopus-backend/src/main/java/com/aaa/cbd/platform/service/material/UploadMaterialToChannelServiceImpl.java
Please move or remove them before you merge.
Aborting
本地有一个小写文件:uploadMaterialToChannelServiceImpl.java
只能先删除本地小写文件,然后执行git pull
命令:
Removing octopus-backend/src/main/java/com/ppdai/cbd/platform/service/material/uploadMaterialToChannelServiceImpl.java
Merge made by the 'recursive' strategy.
省略。。。
拉取更新成功。
git status .
:
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: octopus-backend/src/main/java/com/aaa/cbd/platform/service/material/UploadMaterialToChannelServiceImpl.java
显示我本地没有大写开头文件,我删除的明明是小写的!!
没办法,执行git restore .
撤销本地修改。
脸上笑嘻嘻,心里妈卖批。项目组里面有这种同事,真的是浪费生命。。
附
网上近乎千篇一律的抄来抄去的垃圾解决方案,根本不懂Git:
git config core.ignorecase false
本地代码运行ok,但是发现push上去的代码运行后报错,发现有个文件没注意大小写,于是重命名了该文件,发现git没有识别这个更改,不能提交。(备注:无稽之谈:git server是Linux服务器,大小写敏感的,git不可能识别不了更改)
解决方法:
- 查看git 的设置:
git config --get core.ignorecase
发现默认是不区分大小的,因此当你修改文件名的大小写后,git并不会认为你有修改 - 更改设置:
git config core.ignorecase false