`go build` 找不到版本号。

23

我在电脑A上开发了一个代码库,并创建了一个go.mod/go.sum文件并提交了变更。

我在电脑B上使用go.mod/go.sum文件从代码库中拉取代码,但是在尝试构建程序时,模块的限制条件无法满足。

$ go build
go: finding github.ibm.com/kms/key-protect-client v0.1.5
go: finding golang.org/x/tools v0.0.0-20180221164845-07fd8470d635
go: github.ibm.com/kms/key-protect-client@v0.1.5: unknown revision v0.1.5
go: error loading module requirements

失败的仓库是一个私有仓库,由于某些原因它没有被下载到模块缓存中。在另一台计算机上,依赖关系已经被下载并且构建成功了。我正在构建另一个在同一域中的私有仓库,所以我知道我的github凭证能够访问这些仓库。但由于某种原因,go模块系统无法访问依赖仓库。

我找不到更多信息来调试这个问题。


错误不在于它找不到,而是unknown revision v0.1.5 - 这意味着它找到了,但该git标签不存在。 - Adrian
1
不确定在IBM的GitHub实例中是否可能,但是可以在SO上这个问题的答案中找到一个潜在的解决方案:https://dev59.com/jFQJ5IYBdhLWcg3wl3Ba(使用GITHUB_TOKEN)。 - retgits
@retgits 确实与访问有关:它没有选择正确的协议,我还没有找到如何在 go 构建工具中控制它的指导。电脑 B 上有多个 git 身份,我的本地 git 配置专门为该存储库而设,并没有控制协议,因此它正在使用 https,而需要使用令牌。 - Ravenwater
1
你能否使用git命令行在计算机B上克隆github.ibm.com/kms/key-protect-client?如果不能,那么这似乎更像是一个git问题而不是go问题。 - Mad Wombat
@MadWombat 我可以在计算机B上通过ssh克隆repo。但是,当我查看go build正在做什么时,它正在尝试通过https进行拉取,而这会失败。我如何控制go build进程,以使用特定的git身份验证来访问公共和私有repo? - Ravenwater
显示剩余3条评论
10个回答

32

如果您正在使用私有存储库,可能的解决方案是:

  1. git config --global url."ssh://git@yourserver".insteadOf "https://yourserver"

  2. 检查您的 git 存储库权限


1
如果失败,请尝试使用以下命令强制使用SSH:git config --global url."ssh://yourserver".insteadOf "yourserver" - Fabio Cicerchia
你可能需要添加 go env -w GOPRIVATE=github.com/<org_name> 以避免校验和。 - sebassebas1313

6

我曾经遇到过同样的问题,请访问此链接

确保你已设置了GO111MODULES。

go env -w GO111MODULE=on

确保您的git配置适合私有仓库

git config --global url."ssh://git@github.com:acme-corporation".insteadOf "https://github.com/acme-corporation"

如果使用2FA,请确保创建个人访问令牌。

git config --global url."https://:x-oauth-basic@github.com:acme-corporation".insteadOf "https://github.com/acme-corporation"

设置完以下文件之后:

  • ~/.gitconfig
  • ~/.bashrc

我还需要对 ~ / .netrc 文件进行同样的操作:

machine gitlab.url.com
    login <gitlab username>
    password <GITLAB_TOKEN>

3
一些人(包括我)因安全原因不建议使用.netrc - 添加明文密码或授权令牌是不好的做法,应该仅用于确定失败的原因。这个问题有其他解决方案 - 请参见上面的帖子。 - Remigius Stalder

3

如果之前的答案都没有帮助(请参考先前的回答),可以尝试使用以下方法:

go get -u

-u标志指示get更新模块,以便在可用时使用更高级别的次要或补丁版本为命令行上命名的软件包提供依赖项。

此外,我建议使用像gobrew这样的版本管理器。您可以轻松地切换版本,因为有时也可能是与版本相关的问题。

如果您这样做,还可以为您的tidy设置兼容性版本,例如:

go mod tidy -compat=1.17

现在,您已经准备好构建:
go clean --modcache
go get -u
go build

2
问题与cmd/go不知道git身份有关,它假定只有一个在.gitconfig文件中声明。解决方法是:准备一组git身份来替换全局的.gitconfig,当你需要使用该git身份并处理更新模块文件的cmd/go工具时使用。"Original Answer"翻译成"最初的回答"。

25
这是一个抽象的解决方案 - 你能写下实际的步骤/命令以便处理吗? - Noam Manos
本文详细解释了该过程:http://www.thecodedself.com/Using-Multiple-Author-Identities-With-Git/ - Ravenwater

1

通常的原因可能是仓库是私有的,所以您首先应该获得授权。创建 .netrc 文件并在其中包含您的凭据,您可以在此处找到完整的说明:https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html

如果您想构建一个 Docker 镜像,您可以使用这个 DockerFile 示例。

ENV GOPRIVATE "gitlab.com/yourPrivateRepo"

ARG GO_GET_TOKEN_PASS
ARG GO_GET_TOKEN_LOGIN

RUN touch ~/.netrc && \
    chmod 600 ~/.netrc && \
    echo "machine gitlab.com login ${GO_GET_TOKEN_LOGIN} password ${GO_GET_TOKEN_PASS}" > ~/.netrc

1
如果出现以下错误信息:

"Error": "unknown revision ..."

或者

"Error": "invalid version ..."

请确保没有指定PR(pull request)的哈希值。即使合并后的PR也可能是错误的。在github仓库下查找提交哈希值,但不要在/pulls下查找。
/commits下查找。更多信息请参见这里:golang/go#31191 明确过滤掉了这些类型的提交。

1

以防万一,你是否在B电脑的环境变量GOPRIVATE中添加了"github.ibm.com/kms"?我曾经因为这个原因遇到过这个错误。


0

0
在某些情况下,除了在 git 中配置 url-insteadOf 配置之外,您还需要禁用 GOPROXYGOSUMDB,方法如下:
$ go env -w GOPROXY=direct GOSUMDB=off

执行 go env 命令前后可以展示出其效果。使用上述命令来禁用这些设置,可以确认是否是导致失败的原因。由于禁用校验和验证会存在一定的安全风险,建议保留 GOPROXYGOSUMDB 设置以用于导入公共模块。您可以在此处找到有关如何实现此操作的更多信息:

https://jfrog.com/blog/why-goproxy-matters-and-which-to-pick/


1
总是乐意帮助 - Remigius Stalder
GOSUMDB=off 禁用下载模块的校验和验证。这不是良好的安全实践。 - kondrak
@kondrak:请查看解释和链接,了解如何保持公共模块的代理和校验和验证——我提到这是“确定失败原因”的方法。 - Remigius Stalder
1
我现在已经更清楚地表明了,建议的配置只是为了检查这是否是错误的原因。 - Remigius Stalder

0
在我的情况下,似乎Go尝试下载模块的默认位置没有包含所需的(旧)版本。像这样设置Go代理环境变量export GOPROXY=https://proxy.golang.org解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接