【问题标题】:go build can't find a revisiongo build 找不到修订版
【发布时间】:2022-05-06 02:01:24
【问题描述】:

我在计算机 A 上开发了一个 repo,并创建了一个我签入的 go.mod/go.sum。

我使用计算机 B 上的 go.mod/go.sum 文件提取该 repo,但是当我尝试构建程序时,无法满足模块约束。

$ 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

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

我找不到更多关于如何调试的信息。

【问题讨论】:

  • 错误不是找不到,而是unknown revision v0.1.5 - 表示确实找到了,但是那个git标签不存在。
  • @adrian,该标签存在于 repo 中,因为它的存在使它成为计算机 A 上的 go.mod 文件。只是无法在计算机 B 上使用它,我想明白为什么。整个私有域 (github.ibm.com) 没有在 mod 缓存中创建,我认为这是在计算机 B 上找不到标签的原因。
  • 不确定 IBM 的 GitHub 实例是否可行,但可以在 SO:stackoverflow.com/questions/53516358/…(使用 GITHUB_TOKEN)的此问题的答案中找到潜在的解决方案。
  • @retgits 它确实与访问有关:它没有选择正确的协议,我还没有找到如何在 go build 工具中控制它的指导。计算机 B 上有多个 git 身份,而我专门用于该 repo 的本地 git 配置似乎无法控制协议,因此它在需要使用令牌的地方使用 https。
  • 你能用git命令行克隆计算机B上的github.ibm.com/kms/key-protect-client吗?如果不是,听起来更像是 git 问题而不是 go 问题。

标签: go github module


【解决方案1】:

如果您使用的是私有存储库,golang 未知版本的可能解决方案:

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

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

【讨论】:

  • 如果失败,请尝试使用以下命令强制 SSH:git config --global url."ssh://yourserver".insteadOf "yourserver"
  • 您可能需要添加go env -w GOPRIVATE=github.com/<org_name> 以避免校验和
【解决方案2】:

我有同样的问题,请访问the link

确保您已设置 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>

【讨论】:

  • 出于安全原因,有些人(包括我)不鼓励使用.netrc - 添加明文密码或身份验证令牌是 imo 不好的做法,只能用于确定失败的原因。这个问题还有其他解决方案 - 请参阅上面的帖子。
【解决方案3】:

问题与 cmd/go 不知道 git 身份有关,并假设 .gitconfig 文件中只有一个。

解决方法:当您需要使用该 git 身份并处理更新模块文件的 cmd/go 工具时,准备好一组 git 身份来替换全局 .gitconfig。

【讨论】:

【解决方案4】:

如果没有任何帮助(请参阅之前的答案),请使用:

go get -u

-u 标志指示 get 更新提供依赖项的模块 命令行上命名的软件包以使用较新的次要或补丁 可用时发布。

此外,我建议使用像 gobrew 这样的版本管理器。您可以轻松地在版本之间进行更改,因为有时它也可能是与版本相关的问题。

如果你这样做,你也可以为你的tidy设置兼容版本,例如:

go mod tidy -compat=1.17

现在您已准备好构建:

go clean --modcache
go get -u
go build

【讨论】:

    【解决方案5】:

    万一得到

    “错误”:“未知修订...”

    “错误”:“无效版本...”

    确保您没有指定 PR 的散列(拉取请求)。即使是合并的 PR 也可能是错误的。

    在 github repo 中查找提交哈希 在/commits 下,但不在/pulls 下。

    在此处查看更多信息:golang/go#31191 明确过滤掉此类提交。

    【讨论】:

      【解决方案6】:

      以防万一,您是否将"github.ibm.com/kms" 添加到计算机B 上的环境变量GOPRIVATE 中?由于这个原因,我遇到了这个错误。

      【讨论】:

        【解决方案7】:

        与上面的一些 cmets 一致——我遇到了这个问题,因为我的 git 由于更新到 Mojave 而被炸了......这里高度赞成的回复 (xcode-select --install) 让我通过了这个错误消息 Git is not working after macOS Mojave Update (xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)

        如果您遇到此问题,请确保您的 go status 等按预期工作。

        【讨论】:

          【解决方案8】:

          在某些情况下,除了在 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/

          【讨论】:

          • 这个解决方案对我有用,谢谢。
          • 总是乐于提供帮助
          • GOSUMDB=off 禁用下载模块的校验和验证。这不是好的安全做法。
          • @kondrak:请参阅解释和链接,了解如何为公共模块保留代理和校验和验证 - 我提到这是“确定失败的原因”。
          • 我现在已经说得更清楚了,建议的配置只是为了检查这是否是错误的原因。
          【解决方案9】:

          通常原因可能是存储库是私有的,因此您应该首先获得授权。创建 .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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-24
            • 1970-01-01
            • 2021-03-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-10
            相关资源
            最近更新 更多