Git 不识别文件名字母大小写变化
问题
今天为一个项目撰写持续构建计划,撰写 Jenkinsfile 之后进行构建时报错:
[2022-05-23 16:54:21] unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /root/workspace/Dockerfile: no such file or directory script returned exit code 1
我一开始还以为是我写的 Jenkinsfile 有问题,可是这个 Jenkinsfile 内容极其简单,就是拉取代码然后docker build,所以百思不得其解。然后仔细一看这个报错信息,又 Google 查了,可以确认出错的原因就是找不到 Dockerfile 这个文件。
然后我打开了代码仓库,定睛一看,好家伙,只有 dockerfile 而没有 Dockerfile,这我能忍。当时就本地打开我的 VSCode 就是一个重命名操作,嗯很好。然后重命名后一看,Git 状态没有丝毫变化,我愣住了。然后又去 Google,发现这是我本机 Git 默认的正常操作,也就是说 Git 它会忽略文件名大小写变化。
解决方案
为了解决上述这个问题,可以终端运行以下命令:
git mv dockerfile Dockerfile
如果一次重命名了很多文件呢
只有一个文件名大小写变化的这种场景,已经知道怎么应对了。要是有很多个文件都是名字大小写变化,这种情况又该怎么办呢。
不要慌,遇到这种场景,首先可以移除所有 git 缓存:
git rm -r --cached .
上面这个命令将移除当前文件夹下所有文件/文件夹的 Git 缓存版本。运行这个命令后,会看到所有文件中都显示在 git changes中。
接下来,继续运行:
git add --all .
就可以重新添加所有文件,仅显示有更改的文件喽。
如果是文件夹呢
前述问题是文件名大小写发生了变化,Git 识别不出来的解决方案,如果要是换做文件夹,又该如何解决呢。
先来试一下上述的针对文件的解决方案吧:

(注:lf 命令是我个人自定义的一个命令别名。这里安利一下使用 exa 替代 ls)
奇怪,报错了。发生这种现象的主要原因是当前正使用的是不区分文件名大小写的操作系统。事实上,最常见的两种用户电脑操作系统 Windows 和 macOS 都是不区分文件名大小写的操作系统。
那么对于文件夹名字大小写的变化,应该怎么让 Git 识别呢,可以用计算机科学领域内常用的分层思想:加一个中间层。在这里也就是借助一个临时的文件夹名字,具体命令如下:
git mv myfolder tempFolder && git mv tempFolder myFolder
这样确实也能解决问题,就是看起来好像有点投机取巧的意思,嗯...不太那么优雅。那么有没有更好的方法呢,当然有!用前面在 如果一次重命名了很多文件呢 部分里提到的方法就好了:
git rm -r --cached .
git add --all .
Git 忽略文件名大小写
Git 的这种行为是由其 core.ignorecase 这个设置项控制的,而在 Windows 和 macOS 这两种不区分文件名大小写的系统上 core.ignorecase 的默认值为 true。那么马上就会想到,是否可以通过修改这个设置然后一劳永逸地解决这个问题呢。答案是不可以!Say No!!!不建议通过设置 corre.ignorecase=false来更改 Git 配置以忽略文件名大小写的原因主要是这会引起一些问题。
设置core.ignorecase=false导致的问题
假设现在有一个文件为 dockerfile,将其重命名为 Dockerfile,这个时候 Git 不会显示任何文件变化,因为 Git 默认忽略文件名大小写变化嘛。好的,现在设置 Git core.ignorecase=false 配置,观察状态就会发现 Git 将 Dockerfile 当作了一个新文件(注意:dockerfile 依然是在之前已 commited 的文件中),这显然不是我们想要的结果。如果不小心将这个文件 commit 并且也 push 了,那么远程仓库现在就会同时有 dockerfile 和 Dockerfile 两个文件。
解决core.ignorecase=false引发的灾难
如果发生了前文所说的问题也不要慌,凡事总是有解决方案的,不要急,慢慢来。具体的方案如下:
- 保持
core.ignore=false这一配置项不变 - 在本机文件系统中手动删除
Dockerfile这个文件 - 看
git status确定dockerfile和Dockerfile两个文件都已被删除 - commit 并且 push
git checkout -- Dockerfile撤销对我们需要保持的那个文件的删除操作- 现在设置
core.ignorecase=true

Git 不识别文件名字母大小写变化的更多相关文章
- 关于git不区分文件名大小写的处理
今天遇到了git不区分文件名大小写的问题,一开始着实郁闷了一把. 处理办法: windows下在git中修改文件的大小写 git mv --force myfile MyFile 或者 git mv ...
- 当git上只做文件大小写重命名的修改时,如何躲坑
一. 提交时 假设修改ABC.java为Abc.java. 1.1 如果使用git命令进行仅涉及大小写的重命名 1.1.1 设置git库为大小写敏感(不建议) $ git config core.ig ...
- js 处理字母 大小写的 一些函数
js中实现字母大小写转换主要用到了四个js函数: 1.toLocaleUpperCase2.toUpperCase3.toLocaleLowerCase4.toLowerCase 下面就这四个实现大小 ...
- 用CSS text-transform转换字母大小写
以前我们都是用JS来实现字母的首字母大小写的,但现在没有必要了,CSS完全可以实现,话说兼容性还好从IE6开始就支持了. text-transform:none | capitalize | uppe ...
- js中实现字母大小写转换
js中实现字母大小写转换主要用到了四个js函数: 1.toLocaleUpperCase 2.toUpperCase3.toLocaleLowerCase4.toLowerCase 下面就这四个实现 ...
- php 字母大小写转换的函数
分享下,在php编程中,将字母大小写进行转换的常用函数. 1.将字符串转换成小写strtolower(): 该函数将传入的字符串参数所有的字符都转换成小写,并以小定形式放回这个字符串 2.将字符转成大 ...
- css 设置英文字母大小写转换(text-transform)
css 设置英文字母大小写转换 CreateTime--2018年5月25日07点16分 Author:Marydon 1.实现:通过text-transform实现 2.text-transfo ...
- python字符串的操作(去掉空格strip(),切片,查找,连接join(),分割split(),转换首字母大写, 转换字母大小写...)
#可变变量:list, 字典#不可变变量:元祖,字符串字符串的操作(去掉空格, 切片, 查找, 连接, 分割, 转换首字母大写, 转换字母大小写, 判断是否是数字字母, 成员运算符(in / not ...
- jackson序列化字段字母大小写及字段名重复
一:Jackson默认的属性发现规则将会查找到如下所述的属性: 1.所有被public修饰的字段(成员变量): 2.所有被public修饰的getter(即形如“getXxx()”的方法): 3.所有 ...
随机推荐
- javascript新手实例1-DOM基本操作
学习javascript好多同学不知道怎么上手,跟着网上的新手教程做了一遍又觉得javascript很简单,但是真正自己用起来又觉得写不出什么东西,我觉得学习最好的方法就是跟着有趣的例子做,所以我们的 ...
- Content Security Policy减少劫持
Content Security Policy减少劫持 什么是CSP? CSP是由单词 Content Security Policy 的首单词组成,是HTML5带给我们的一套全新主动防御的体系,旨在 ...
- 前端调试利器 - Charles
Docs 开发之 Charles 配置指南 1.下载与安装 charles-proxy-4.1.4 .dmg56.12 MB已存到云盘下载 2.激活 使用公司正版license 激活 安装证书 点击证 ...
- 将HTML页面转换为PDF文件并导出
目前,在大多数的管理系统中,都会有这样一个功能:根据相关的条件查询相应的数据,并生成可视化报表,然后可导出为PDF文件.本文只展现生成可视化报表之后导出PDF文件的过程,生成可视化的报表可使用Echa ...
- EMS查看邮箱容量限制的方法
以Exchange管理员身份打开EMS控制台.在PowerShell命令行提示符下,输入以下命令. Get-MailboxDatabase | FL name,IssueWarningQuota,Pr ...
- Java中最早期的集合Vector
1.Vector类可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作. 2 ...
- LC-54
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2 ...
- 20220406Java
记个笔记 字符串操作类中s1.compareTo(s)规则: Compares two strings lexicographically. The comparison is based on th ...
- DRF 过滤排序分页异常处理
DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~
- 得到一个a(10)到b(20)的随机数。包括10和20