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

参考资料

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐