问题

今天为一个项目撰写持续构建计划,撰写 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 了,那么远程仓库现在就会同时有 dockerfileDockerfile 两个文件。

解决core.ignorecase=false引发的灾难

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

  1. 保持core.ignore=false这一配置项不变
  2. 在本机文件系统中手动删除 Dockerfile 这个文件
  3. git status 确定 dockerfileDockerfile 两个文件都已被删除
  4. commit 并且 push
  5. git checkout -- Dockerfile 撤销对我们需要保持的那个文件的删除操作
  6. 现在设置 core.ignorecase=true

Git 不识别文件名字母大小写变化的更多相关文章

  1. 关于git不区分文件名大小写的处理

    今天遇到了git不区分文件名大小写的问题,一开始着实郁闷了一把. 处理办法: windows下在git中修改文件的大小写 git mv --force myfile MyFile 或者 git mv ...

  2. 当git上只做文件大小写重命名的修改时,如何躲坑

    一. 提交时 假设修改ABC.java为Abc.java. 1.1 如果使用git命令进行仅涉及大小写的重命名 1.1.1 设置git库为大小写敏感(不建议) $ git config core.ig ...

  3. js 处理字母 大小写的 一些函数

    js中实现字母大小写转换主要用到了四个js函数: 1.toLocaleUpperCase2.toUpperCase3.toLocaleLowerCase4.toLowerCase 下面就这四个实现大小 ...

  4. 用CSS text-transform转换字母大小写

    以前我们都是用JS来实现字母的首字母大小写的,但现在没有必要了,CSS完全可以实现,话说兼容性还好从IE6开始就支持了. text-transform:none | capitalize | uppe ...

  5. js中实现字母大小写转换

    js中实现字母大小写转换主要用到了四个js函数: 1.toLocaleUpperCase  2.toUpperCase3.toLocaleLowerCase4.toLowerCase 下面就这四个实现 ...

  6. php 字母大小写转换的函数

    分享下,在php编程中,将字母大小写进行转换的常用函数. 1.将字符串转换成小写strtolower(): 该函数将传入的字符串参数所有的字符都转换成小写,并以小定形式放回这个字符串 2.将字符转成大 ...

  7. css 设置英文字母大小写转换(text-transform)

      css 设置英文字母大小写转换 CreateTime--2018年5月25日07点16分 Author:Marydon 1.实现:通过text-transform实现 2.text-transfo ...

  8. python字符串的操作(去掉空格strip(),切片,查找,连接join(),分割split(),转换首字母大写, 转换字母大小写...)

    #可变变量:list, 字典#不可变变量:元祖,字符串字符串的操作(去掉空格, 切片, 查找, 连接, 分割, 转换首字母大写, 转换字母大小写, 判断是否是数字字母, 成员运算符(in / not ...

  9. jackson序列化字段字母大小写及字段名重复

    一:Jackson默认的属性发现规则将会查找到如下所述的属性: 1.所有被public修饰的字段(成员变量): 2.所有被public修饰的getter(即形如“getXxx()”的方法): 3.所有 ...

随机推荐

  1. Clickhouse-alter 对副本表修改表结构报元数据错误

    [应用场景] 对分片副本表的列进行 alter 操作 [问题复现] [解决办法] 检查该分片所有副本表的表结构和 zk 上存储的 column 信息保持一致,检查本地的表结构 sql 文件 /data ...

  2. js随手笔记-------理解JavaScript碰撞检测算法核心简单实现原理

    碰撞检测在前端游戏,设计拖拽的实用业务等领域的应用场景非常广泛,今天我们就在这里对于前端JavaScript如何实现碰撞检测算法进行一个原理上的探讨,让大家能够明白如何实现碰撞以及碰撞的理念是什么:1 ...

  3. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  4. EMS邮箱数据库常用命令(一)

    案例任务:创建名为"book"的邮箱数据库,数据库文件和日志文件存储位置为"c:\book". 键入以下命令. New-MailboxDatabase -Nam ...

  5. 微信小程序发送验证码功能,验证码倒计时

    data{ timer:'', countDownNum:'发送验证码', } // 点击验证码倒计时获取验证码 Gain:function(e){ let that = this let count ...

  6. 为Anaconda python3安装gi模块

    项目开发中需要使用到gi模块,Ubuntu自带的Python3.5可以正常使用gi.项目解释环境是Anaconda python3.5,提示ImportError: No module named ' ...

  7. python数据类型与基础运算

    注释:了解其他数据类型补充 基础数据类型补充 可以回一下之前的数据类型: 整型,浮点型,字串符和列表. 一.字典(dict) #字典:可以精准的储存数据 是用大括号表示'{}' '字典和数据数据列表差 ...

  8. 一些有用的工具,iftop,iotop,htop,glances

    一些有用的工具: yum install glances -y资源监控工具GLANCESglances 可以为 Unix 和 Linux 性能专家提供监视和分析性能数据的功能,其中包括:CPU 使用率 ...

  9. docker将jar打包镜像文件

    1.首先需要编写dockerfile文件,通过dockerfile文件将jar包打成镜像 编写dockerfile文件 # 定义父镜像 FROM java:8 # 维护者信息 MAINTAINER c ...

  10. flink调优之RocksDB设置

    一.开启监控 RocksDB是基于LSM Tree实现的,写数据都是先缓存到内存中,所以RocksDB的写请求效率比较高.RocksDB使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中bl ...