前言 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 可以通过测试。
参考资料