解决 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
是默认忽略大小写问题的,就是说 OpenAPIv2
和 openapiv2
对于 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
可以通过测试。