问题

今天为一个项目撰写持续构建计划,撰写 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. css 垂直居中方法汇总

    查看原文可以有更好的排版效果哦 前言 居中是平时工作中的最常见的一种需求,各种图片居中或者各种弹窗,水平居中还好,特别是垂直居中,很多初学者表示太难写了,现在列举一些常用的方法. 实战 这里只讲述cs ...

  2. WordPress 网站开发“微信小程序“实战(三)

    本文是"WordPress 开发微信小程序"系列的第三篇,本文记录的是开发"DeveWork+"小程序1.2 版本的过程.建议先看完第一篇.第二篇再来阅读本文. ...

  3. ES6-11学习笔记--let

    新声明方式:let 1.不属于顶层对象 window 2.不允许重复声明 3.不存在变量提升 4.暂时性死区 5.块级作用域   原来var声明: var a = 5; console.log(a); ...

  4. 关于#pragma 和 _pragma

    首先要明确 #pragma 和_Pragma 是什么 这两个都是出自于c/c++ 的 ,其中#pragma 是预处理指令(preProcess directive ) ,#pragma是用来向编译器传 ...

  5. SSM实现个人博客-day04

    项目源码免费下载:SSM实现个人博客 有问题询问vx:kht808 3.项目搭建(SSM整合) (1)创建maven工程,导入相应的依赖 <properties> <project. ...

  6. 简易table form梳理

    <!--      A:表格-table    <双标签,day3上午第一次接触>         作用:显示信息     一:table简易案例:         <tabl ...

  7. 【LeetCode】24.两两交换链表中的节点

    24.两两交换链表中的节点 知识点:链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 示例 1 ...

  8. Springmvc 如何配置一个MAVEN项目,eclipse视图详解

    1,首先主页创建一个maven project项目, 2-3,创建完成会报错因为缺少WEB-INF文件右键点击选取,会自动创建web.xml文件 4 ,调试版本 因为默认创建的maven版本不支持,所 ...

  9. 【第六课】SHELL和计划任务(学习笔记)

    4月15日学习笔记

  10. python学习-Day7

    目录 作业讲解 数据类型内置方法2 字符串(str) 列表(list) 类型转换 内置方法 索引取值 切片操作 步长 统计列表中元素的个数 成员运算 (in和not in) 列表添加元素的方式* 删除 ...