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服务端存在两个文件,一个大写开头,一个小写开头。

遗留问题:如上图,分明有改过三个文件的大小写,可是为啥只有一个文件导致后续的各种麻烦???印象中,三次提交没区别啊

解决方法就很简单:删除小写开头的。

怎么删?

  1. 最快速的方法,当时是直接在服务端删除,前提是需要有master权限;
  2. 客户端提交?可客户端明明已经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不可能识别不了更改)
解决方法:

  1. 查看git 的设置:git config --get core.ignorecase
    发现默认是不区分大小的,因此当你修改文件名的大小写后,git并不会认为你有修改
  2. 更改设置:git config core.ignorecase false

参考

Git 仓库中文件名大小写问题

posted @ 2021-09-06 22:14  johnny233  阅读(61)  评论(0编辑  收藏  举报  来源