首页 > 解决方案 > 如何在未发布的伪版本中使用 Go Mod 下载

问题描述

自 golang 1.13 以来,我一直遇到这个问题,go mod download如果给定的依赖项是分支上未发布的伪版本,我们的 docker 构建脚本(使用 获取我们的依赖项)在 git fetch 期间失败。我目前正在使用 golang 1.15。

我正在尝试集成测试对引用的 go 包的一些更改。我会打电话给包裹example-go-sdk。在 git repo for 中example-go-sdk,我创建了一个分支并推送了一些更改。然后在使用的golang项目中example-go-sdk,我执行了:

go get local.url.that.utilizes.goprivate/path/example-go-sdk@824eebca783c68c5ef3cf6db35ad688ad30b58b0

该哈希是我分支上的头部提交的哈希,我已经仔细检查过它是正确的并且确实有我的更改。该项目在本地编译就好了。甚至 go mod 下载也适合我。

但是,当go mod download从 golang:1.15-alpine docker 容器中执行时(确保 GOPRIVATE 设置正确后),我收到此错误:

go: local.url.that.utilizes.goprivate/path/example-go-sdk@v1.1.2-0.20210329043657-824eebca783c: invalid pseudo-version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /go/pkg/mod/cache/vcs/369a4408a70eeb73ab52db67cb0c1ba8eb165df174d65c9ec995526a9545424b: exit status 128:
    fatal: unresolved deltas left after unpacking
    fatal: unpack-objects failed

有没有办法来解决这个问题?由于其他一些要求,我无法example-go-sdk先将此分支合并到 master 中,然后再尝试引用它。我已确保 docker 构建使用正确版本的引用项目以及更新的go.modand go.sum

尽管这一切对我来说都在本地工作,但其他几个团队成员在引用伪版本时也遇到了构建问题,所以我不确定这是什么问题。

标签: gitgogo-modules

解决方案


在可预见的将来,该go命令确实并将继续支持提交的伪版本。这看起来像是您的存储库中的数据损坏,或者您的git服务器和/或客户端中的错误。

由于失败的命令是git fetch尝试解决存储库中现有分支和标签的命令,因此我的猜测是该问题会影响存储库中的某些非默认分支或某些现有标签。这可以解释为什么您的预发布标签解决方法有效:如果go命令可以找到特定的匹配标签,那么它不需要回退到获取“所有分支和标签”,并且可能不会触发潜在git问题。

git您也许可以通过在您的 repo 的新克隆中尝试失败的命令来开始缩小范围:

git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/*

请注意,您可以将-x标志传递给go命令以使其(非常冗长!)打印git它执行的所有命令。这可能会帮助您重现触发底层错误的确切存储库配置。


推荐阅读