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 识别不出来的解决方案,如果要是换做文件夹,又该如何解决呢。
先来试一下上述的针对文件的解决方案吧:

Git 不识别文件名字母大小写变化
(注: lf 命令是我个人自定义的一个命令别名。这里安利一下使用 exa 替代 ls)

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

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

git mv myfolder tempFolder && git mv tempFolder myFolder

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

git rm -r --cached .
git add --all .

Git配置项 core.ignorecase

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

参考

Git 不识别文件名字母大小写变化

Original: https://www.cnblogs.com/astrofeyx/p/git-ignore-filename-case.html
Author: 徐风吟
Title: Git 不识别文件名字母大小写变化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582468/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 27. rz与sz上传下载文件

    工作中需要在 Linux 和 Windows 之间传输文件,一般使用xftp等gui工具完成。但是有些第三方linux命令也可以完成上传下载操作 从Linux下载文件到本机 , 在…

    Linux 2023年5月27日
    082
  • 操作系统实现-loader

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 大家好呀,终于我们到了操作系统的loader部分了,loader也是操作系…

    Linux 2023年6月13日
    073
  • KVM http网络加载镜像报错(mount: wrong fs type, bad option, bad superblock on /dev/loop0)

    curl: (23) Failed writing body (7818 != 16384)loop: module loadeddracut-initqueue[579]: mo…

    Linux 2023年6月6日
    0149
  • sublime text里面中文字体显示异常解决方案

    sublime text下载之后一开始转成中文之后,会出现中文显示异常的问题,比如下图中”门”字显示异常 通过如下的设置可以解决该问题: 首选项&#8211…

    Linux 2023年6月13日
    0197
  • Java8新特性终极指南

    欢迎来到Java学习之Java8新特性终极指南 目录 系列文章目录 @ 目录 系列文章目录 Java语言新特性 Lambda表达式 函数式接口 方法引用 接口的默认方法 重复注解 …

    Linux 2023年6月13日
    0109
  • 模拟一个简单的tomcat

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0117
  • openssh升级

    bash;gutter:false; ssh -V</p> <p>cp -a /etc/ssh/sshd_config /etc/ssh/sshd_conf…

    Linux 2023年6月7日
    084
  • 这个世界上只有一种真正的英雄主义,那就是认清生活的真相并且仍然热爱它

    人生当中成功只是一时的,失败却是主旋律。但是如何面对失败,却把人分成了不同的样子。有的人会被失败击垮,有的人能够不断地爬起来继续向前。澳大利亚队是如此的,西班牙队也是如此。我想真正…

    Linux 2023年6月14日
    0135
  • 配置管理docker对象和守护进程

    使用 Docker 的主要工作是创建和使用各类对象:镜像、容器、网络、卷等。 1、Docker对象的标记 标记(Label):是一种将元数据应用于Docker对象(镜像、容器、网络…

    Linux 2023年6月8日
    085
  • [CentOS7]redis设置开机启动,设置密码

    简介 上篇文章介绍了如何安装redis,但每次重启服务器之后redis不会自启,这里将介绍如何进行自启设置,以及如何设置redis的密码,进行密码验证登陆。 上篇文章: Cento…

    Linux 2023年5月28日
    0108
  • shell脚本字符串截取方法整理

    首先先声明一个变量str,下面演示以该变量为例: str=’https://www.baidu.com/about.html’ 1.#号截取,删除左边字符,保留右边字符 echo …

    Linux 2023年5月28日
    079
  • 【原创】Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    092
  • 进程间通信(IPC)

    进程间通信(Interprocess Communication,IPC)是指两个或者多个进程之间进行数据交换的过程 进程拥有独立的内存空间 命令行参数(向子进程传递和exec系列…

    Linux 2023年6月6日
    0118
  • 机器学习导引

    三种范式 常常定义一种损失函数,对训练集进行处理时使其最小化。该函数代表了系统输出对于正确输出的错误率,因为训练集的给定的输出是正确的 学习数值型预测函数,比如房价预测模型 在训练…

    Linux 2023年6月7日
    072
  • XCTF pwn新手区解题记录

    一、前言 闲来无事,刷刷ctf题 二、题目: level0 1、下载好题目后,拖入到kali中去,用 file 和 checksec 查看一下,可以发现该程序是 64&#x…

    Linux 2023年6月8日
    0108
  • 2021年3月-第02阶段-前端基础-移动WEB开发-移动WEB开发_rem布局

    移动web开发之rem布局 rem基础 rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。 不同的是rem的基准是相对于html元素的字体大小…

    Linux 2023年6月8日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球