解决 vendor 中存在大小写变更问题

前言

go mod (vendor) 是 golang 中依赖管理的一个工具,而 git 是个版本管理工具,两者结合本该是相得益彰事情,然而在某些情况下并不是如此

在某个项目中,需要更新 k8s.io/client-go 以获得更高 kubernetes 版本的支持,原本这个 k8s.io/client-go 设计向下兼容的,所以很大情况升级并不会产生很大的风险,而这就产生了下面问题的导火索

升级

升级 client-go 非常简单,只需执行一下命令

git get -u k8s.io/client-go@v0.19.0

更新vendor也只需执行

go mod vendor

执行之后似乎并没有任何错误,一切都在朝好的方向发展,本地执行构建也没有任何错误

go build # 使用 go mod 编译
go build -mod=vendor # 使用 vendor 编译

结果和预期一样,并没有任何错误,只需提交代码

git add go.mod go.sum
git commit -m "update client-go to v0.19.0"
git add vendor/
git commit -m "update vendor package to v0.19.0"
git push

等待 reviewr 审查结束即可合并到主分支。

然而并不是如此!!!!

问题

reviewr 将指定分支的代码拉取到本地后,进行构建发现,vendor 中缺少依赖

build app: cannot load github.com/googleapis/gnostic/openapiv2: open /go/src/app/vendor/github.com/googleapis/gnostic/openapiv2: no such file or directory

第一直觉是,可能有某些文件并没有提交上去,然后重新执行了一次了

go mod vendor
git add vendor/
git commit -v --amend --no-edit
git push

结果提示,并没有变化 Everything up-to-date, 从这就感觉有点匪夷所思了。通过本地查看,文件是存在的

ls vendor/github.com/googleapis/gnostic
LICENSE    compiler   extensions   openapiv2

通过 git ls-files --error-unmatch 命令也是可以查到文件是被跟踪了,这就说明 git push 的时候会上传该文件

git ls-files --error-unmatch vendor/github.com/googleapis/gnostic/openapiv2
vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.go
vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.pb.go
vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.proto
vendor/github.com/googleapis/gnostic/openapiv2/README.md
vendor/github.com/googleapis/gnostic/openapiv2/openapi-2.0.json

reviewr 上执行 ls vendor/github.com/googleapis/gnostic

LICENSE    OpenAPIv2  compiler   extensions

发现了在 reviewr 内容竟然和我不一样,OpenAPIv2 存在大写,而我的文件下是小写 openapiv2,这就很奇怪了。在搜索引擎上搜索 git 大小写问题,知道了 git 是默认忽略大小写问题的,就是说 OpenAPIv2openapiv2 对于 git 来说,是同一个,这就导致了不会更新到 git 的问题。

而执行 go mod vendor 的时候,他将会删除目录的。所以在我电脑上不存在任何问题。

修复

知道了问题原因,那就需要着手解决这个问题了。git 默认忽略大小写,是不是只要开启这个设置,就没有问题了?

查看本机 git 配置

git config --get core.ignorecase

true 表示忽略大小写

改成 false

git config core.ignorecase false

再执行 git status -s, 确实存在文件未跟踪

?? vendor/github.com/googleapis/gnostic/openapiv2/

通过以下方式提交

git add vendor/github.com/googleapis/gnostic/openapiv2/
git commit -v --amend --no-edit
git push

reviewr 再次重试,发现问题并没有解决,重复上面的检查步骤,目录里面也还是存在大写

LICENSE    OpenAPIv2  compiler   extensions

这就直接导致了,懵逼三连了,查找网上资料,通过 git mv 方式, 问题同样没有解决,解决只是在本地解决,任何一个人拉取下来还是一样的问题。

最后经过多次尝试,找到了一种解决方案

git rm -r -f vendor
rm -rf vendor
git commit -m "update venodr"
go mod vendor
git add vendor
git commit -v --amend --no-edit
git push

最终 reviewr 可以通过测试。

参考资料