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)

大家都在看

  • 那些shellcode免杀总结

    首发先知: https://xz.aliyun.com/t/7170 自己还是想把一些shellcode免杀的技巧通过白话文、傻瓜式的文章把技巧讲清楚。希望更多和我一样web狗也能…

    Linux 2023年5月28日
    081
  • python2.6.6安装Image模块

    python2.6.6安装Image模块1、下载Image模块源码地址:http://www.pythonware.com/products/pil/index.htm2、加压文件…

    Linux 2023年6月14日
    096
  • 每天一个 HTTP 状态码 101

    101 Switch Protocols 指示服务器端响应了客户端切换协议的要求… 101 Switching Protocols 当客户端的请求具有 Upgrade …

    Linux 2023年6月7日
    0119
  • 正则: 匹配英文、数字和所有特殊字符

    r”’\[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;’\\[\]·~!@#¥%……&*()——\-+={}|《》?…

    Linux 2023年6月15日
    0128
  • FTP文件服务的安装与部署

    FTP(文件传输协议)概念 FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式,主被动模式均是以FTP服务器端为参照。企业实际环境中,…

    Linux 2023年6月7日
    093
  • PHP array_reduce()

    array_reduce array_reduce() 将回调函数 callback 迭代地作用到 array 数组中的每一个单元中,从而将数组简化为单一的值。 示例一: 示例二:…

    Linux 2023年6月7日
    0113
  • 高速USB转4串口产品设计-TTL串口

    基于480Mbps 高速USB转8路串口芯片CH344Q,可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动,也支持使用厂商提供的VCP串口驱动…

    Linux 2023年6月7日
    0107
  • go-结构体内存布局

    方式一:通过 var 声明结构体 在 Go 语言中当一个变量被声明的时候,系统会自动初始化它的默认值,比如 int 被初始化为 0,指针为 nil。 var 声明同样也会为结构体类…

    Linux 2023年6月13日
    0102
  • Windows 10安装

    使用U盘安装操作系统教程 本教程介绍如何使用U盘安装操作系统,以安装Windows 10过程作为举例。 1 获取操作系统iso镜像文件 获取操作系统ISO镜像文件有很多途径,此处介…

    Linux 2023年6月13日
    094
  • redis压力测试【转】

    本文转自: https://segmentfault.com/a/1190000015571891 redis自带的redis-benchmark工具 Redis 自带了一个叫re…

    Linux 2023年5月28日
    072
  • Centos7 ifconfig中没有ens33

    在使用Secure CRT连接虚拟机连接不上,可能之前虚拟机关闭不当 登到虚拟机的中断使用ifconfig发现没有ens33 猜测是CentOS图形管理中的NetworkManag…

    Linux 2023年6月13日
    0155
  • SpringBoot入门-Redis(六)

    package com.vast; import com.vast.dao.AccountRepository; import com.vast.dao.IAccountMybat…

    Linux 2023年5月28日
    070
  • Linux tcpdump抓包命令排查

    bash;gutter:true; tcpdump命令行参数介绍:</p> <p>-A 以ASCII格式打印出所有分组,并将链路层的头最小化。 -c 在收到…

    Linux 2023年6月13日
    093
  • redis配置systemctl

    [Unit]Description=redisAfter=network.target [Service]Type=forkingPIDFile=/var/run/redis_63…

    Linux 2023年5月28日
    0107
  • WPF 通过 GifBitmapDecoder 调用 WIC 解析 Gif 和进行动画播放的简单方法

    本文告诉大家如何在 WPF 里,通过 GifBitmapDecoder 调用 WIC 层来解析 GIF 图片,然后采用动画的方式进行播放 使用 WIC 层解析 GIF 图片可以调用…

    Linux 2023年6月6日
    084
  • 渐变色搭配网站(模仿)

    html;gutter:true; 渐变色</p> <pre><code> * { margin: 0; } body { display: f…

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