Git 不识别文件名字母大小写变化
丶Remini
2022年05月23日 23:44

问题

今天为一个项目撰写持续构建计划,撰写  之后进行构建时报错:

  • 1

我一开始还以为是我写的  有问题,可是这个  内容极其简单,就是拉取代码然后,所以百思不得其解。然后仔细一看这个报错信息,又 Google 查了,可以确认出错的原因就是找不到  这个文件。

然后我打开了代码仓库,定睛一看,好家伙,只有  而没有 ,这我能忍。当时就本地打开我的 VSCode 就是一个重命名操作,嗯很好。然后重命名后一看,Git 状态没有丝毫变化,我愣住了。然后又去 Google,发现这是我本机 Git 默认的正常操作,也就是说 Git 它会忽略文件名大小写变化。

解决方案

为了解决上述这个问题,可以终端运行以下命令:

  • 1

如果一次重命名了很多文件呢

只有一个文件名大小写变化的这种场景,已经知道怎么应对了。要是有很多个文件都是名字大小写变化,这种情况又该怎么办呢。

不要慌,遇到这种场景,首先可以移除所有 git 缓存:

  • 1

上面👆这个命令将移除当前文件夹下所有文件/文件夹的 Git 缓存版本。运行这个命令后,会看到所有文件都显示在 git changes 中。 接下来,继续运行:

  • 1

就可以重新添加所有文件,仅显示有更改的文件喽。

如果是文件夹呢

前述问题是文件名大小写发生了变化,Git 识别不出来的解决方案,如果要是换做文件夹,又该如何解决呢。 先来试一下上述的针对文件的解决方案吧:

(注: 命令是我个人自定义的一个命令别名。这里安利一下使用  替代 )

奇怪,报错了。发生这种现象的主要原因是当前正使用的是不区分文件名大小写的操作系统。事实上,最常见的两种用户电脑操作系统 Windows 和 macOS 都是不区分文件名大小写的操作系统。

那么对于文件夹名字大小写的变化,应该怎么让 Git 识别呢,可以用计算机科学领域内常用的分层思想:加一个中间层。在这里也就是借助一个临时的文件夹名字,具体命令如下:

  • 1

这样确实也能解决问题,就是看起来好像有点投机取巧的意思,嗯...不太那么优雅。那么有没有更好的方法呢,当然有!用前面在 如果一次重命名了很多文件呢 部分里提到的方法就好了:

  • 1

  • 2

Git配置项

Git 的这种行为是由其  这个设置项控制的,而在 Windows 和 macOS 这两种不区分文件名大小写的系统上  的默认值为 。那么马上就会想到,是否可以通过修改这个设置然后一劳永逸地解决这个问题呢。答案是不可以!Say No!!!不建议通过设置  使得 Git 忽略文件名大小写的主要原因是这会引起一些问题。

设置导致的问题

假设现在有一个文件为 ,将其重命名为 ,这个时候 Git 不会显示任何文件变化,因为 Git 默认忽略文件名大小写变化嘛。好的,现在设置 Git  配置,观察状态就会发现 Git 将  当作了一个新文件(注意: 依然是在之前已 commited 的文件中),这显然不是我们想要的结果。如果不小心将这个文件 commit 并且也 push 了,那么远程仓库现在就会同时有  和  两个文件。

解决引发的灾难

如果发生了前文所说的问题也不要慌,凡事总是有解决方案的,不要急,慢慢来。具体的方案如下:

  1. 保持core.ignorecase=false这一配置项不变

  2. 在本机文件系统中手动删除 Dockerfile 这个文件

  3. 看 git status 确定 dockerfile 和 Dockerfile 两个文件都已被删除

  4. commit 并且 push

  5. git checkout -- Dockerfile 撤销对我们需要保持的那个文件的删除操作

  6. 现在设置 core.ignorecase=tru