Git 文件名称大小写的天坑

6,939 阅读2分钟

前言

之前是知道 git 可以设置对文件名称大小写是否敏感的。但是一直没有遇到这方面的问题,直到前阵子搭建新项目时,为了规范 vue 组件的命名,需要对原本小写字母开头的文件修改为大写字母开头。遇到了这个让我头疼不已的大小写 bug。

现象

假如现在有个小写字母开头的 vue 文件:small.vue

现在想要把其修改为:Small.vue

发现即使修改了名称,但是 git status 上是没有变化,这个时候我们打开一下 git 大小写敏感git config core.ignorecase false

在修改完的时候,首先在引入组件的地方因为名称的修改会出现红线报错

image.png

然后,网上找找资料,发现说只要把 vscode 删除了重新打开就可以了。

OK,重启 vscode ,发现真的好了!没错,它好了,但是又没有完全好。

好了,coding 完就可以提交代码了。提交的过程也很正常。

直到你发现 git 仓库中同时出现了大小写开头的文件

image.png

在删除小写字母开头文件时遇到的问题

我当初想,只要把小写字母开头的文件删除了就行了。看起来是如此简单,但是又没有那么简单。

首先,我在改成大写字母的 git 分支上是看不到小写文件的,即使是命令行 ls 也是只有大写文件。然后就拉了一条新分支,终于有小写文件了,但是看不到大写文件了。

没关系,我们开始删除小写文件,尝试一下。删除以后 git status 一看,modify 的 delete 了两个文件,大写的和小写的,还没有办法单独删除小写文件。

正确的解法

较好的解法:

  1. 执行git config --global core.ignorecase false,全局设置 大小写敏感

  2. 直接使用以下命令重命名文件,在 git 中不要直接修改文件名,最好的办法是使用下面的方式

git mv -f [你想要删掉的文件] [你想要留下的文件] 
git mv -f a.js A.js 

等同于: 
git rm a.js 
git add A.js

通过上述的方法一个一个文件替代。

暴力解法:

先保存一份修改为大写的文件夹,删除 src push 到分支,然后把保存的文件重新 push 到分支。

当初不这么做的原因是在 master 已经提交了小写文件,需要在 master 上进行此操作,风险太大。

tips

在小写文件修改为大写文件后,会发现修改大写文件,小写文件也会出现在 git 修改上。因为不区分大小写。