前几天同事遇到一个问题,代码修改完本地可以运行,提交到 gitlab ,Jenkins 构建失败,报错找不到文件(图片)。
然后改了半天的路径和引入方式:require
import
@/
相对路径
都试了,还是构建失败。
最后发现本地图片文件名是大写,gitlab 上面是小写,所以导致 Jenkins 构建失败。
这就涉及到 Git 大小写敏感的问题了,简单梳理一下逻辑:
- 张三编写组件
button.tsx
,提交代码 - 张三觉得组件命名不妥,改为
Button.tsx
- 张三并修改所有文件对它的引用,本地环境运行正常,提交代码
- 构建服务器通过 Git 拉取代码,进行构建,Git 未认识到
button.tsx
大小写发生变化, Jenkins 构建找不到Button.tsx
文件,所有引用Button.tsx
的组件发生报错,构建失败。
解决方法
解决 Git 文件名大小写不敏感的方法有多种:
1、改成别的名再改回去:
代码语言:javascript复制# 修改文件名 button.tsx => b.tsx
git add .
git commit -m "修改文件名"
# 再改回来 b.tsx => Button.tsx
git add .
git commit -m "修回文件名"
2、使用 git mv 命令
代码语言:javascript复制git mv button.tsx Button.tsx
不过需要注意:
如果 a.tsx 文件,在本地右键改成 A.tsx,git 是不识别有修改的。 如果 a.tsx 改成 b.tsx,git 是操作是删除 a.tsx,新增 b.tsx,会导致之前的提交记录全部丢失。 正确做法,也就是第 2 种方法,使用 git 重命名,这样 a.tsx 的修改记录会跟过来 b.tsx 。
文件夹的修改:
不过修改文件夹时会出现一些问题:
代码语言:javascript复制git mv dir Dir
可能会报错:
代码语言:javascript复制fatal: renaming 'dir' failed: Invalid argument
可以使用下边这个笨办法修改:
代码语言:javascript复制git mv dir DirTemp
git mv DirTemp Dir
为什么 git 默认不区分文件夹大小写
可能是为了兼容 Windows 和 macOS。因为 Windows 和 macOS 系统文件名不区分大小写,Linux 区分大小写。
预防方案
Git 默认是忽略大小写的,如果改成不忽略大小写是不就可以了?
更改为不忽略大小写
代码语言:javascript复制[core]
ignorecase = false
不过,这样可能会产生更麻烦的问题:
修改文件名时,Git 工作区中一下子增加了两个文件,并且无法删除 git rm 删除文件时,工作区的两个文件都被删除
未经允许不得转载:w3h5 » Git大小写不敏感问题避免,Jenkins代码构建失败踩坑记录