go 默认不信任私有域名,导致“unknown revision”等错误;需设置goprivate和gonosumdb跳过代理与校验,并确保import路径与git url完全一致。

为什么 go get 会报 “unknown revision” 或 “module not found”
这不是网络问题,而是 Go 默认只信任公开的模块代理(如 proxy.golang.org)和校验服务器(sum.golang.org),遇到私有域名(如 git.company.com)时会直接跳过代理、尝试直连——而私有 Git 服务通常不开放公网访问或未配置 HTTPS + 有效证书。
常见现象包括:
go get git.company.com/team/lib: unknown revision mastergo: git.company.com/team/lib@v0.1.0: reading git.company.com/team/lib/go.mod at revision v0.1.0: unexpected status code 404 Not Foundverifying git.company.com/team/lib@v0.1.0: git.company.com/team/lib@v0.1.0: reading https://sum.golang.org/lookup/git.company.com/team/lib@v0.1.0: 410 Gone
根本原因是 Go 模块机制默认将所有非 golang.org / github.com 等白名单域视为“可能不可信”,并拒绝为其提供代理和校验服务。
如何让 go mod 跳过私有域名的代理与校验
只需两行环境变量设置,告诉 Go:“这个域名我来负责,别转发、别校验”:
立即学习“go语言免费学习笔记(深入)”;
export GOPRIVATE=git.company.com export GONOSUMDB=git.company.com
如果私有仓库分散在多个域名下,用逗号分隔:
export GOPRIVATE=git.company.com,git.internal.net,bitbucket.internal export GONOSUMDB=git.company.com,git.internal.net,bitbucket.internal
注意:GOPRIVATE 是核心开关,它同时触发 go 命令跳过代理和校验;GONOSUMDB 是显式兜底,防止某些旧版本 Go 忽略 GOPRIVATE 的校验跳过逻辑。
验证是否生效:
基于ECSHOP2.7.2制作,模板使用的是早期的凡客模板。整站大气,清爽。适合综合,鞋子,服饰类商城使用。具体安装方法在程序包中有说明,在使用之前请看下。 大体方法:1.上传程序至网站根目录,访问:域名/diguo (用户名:admin 密码:123456)2.设置好数据库信息,然后恢复数据,数据目录在www.shopex5.com下.3.修改data目录下的config数据库配置文件。4.登陆
go env GOPRIVATE
输出应包含你的域名。若在 CI 中使用,确保这些变量在 go mod download 和 go build 前已加载。
私有包 import 路径必须和 Git URL 完全一致
Go 不支持“别名导入”。你在 import 语句里写的路径,必须和 Git 仓库的克隆地址(去掉协议和 .git 后缀)严格匹配。
比如你的仓库地址是 https://git.company.com/team/utils.git,那么:
- ✅ 正确:
import "git.company.com/team/utils" - ❌ 错误:
import "company/utils"(路径不匹配,go mod tidy会报错找不到模块) - ❌ 错误:
import "git.company.com/team/utils/v2"(除非你真建了v2子目录并配置了go.mod的 module path 为该路径)
如果你用的是 SSH 地址(如 git@git.company.com:team/utils.git),Go 仍要求 import 路径为 git.company.com/team/utils —— 协议无关,只看域名+路径。
小技巧:运行 go list -m 可查看当前模块识别出的根路径,确认是否与 import 一致。
CI/CD 中 clone 私有仓库失败?检查 Git 凭据和 SSH 配置
设置了 GOPRIVATE 只解决 Go 模块机制层面的问题,但底层 git clone 仍需凭据。常见断点:
- CI 使用 HTTPS 克隆 → 需配置
git config --global url."https://token:x-oauth-basic@".insteadOf "https://"(GitHub/GitLab)或内网 token 替换 - CI 使用 SSH 克隆 → 确保
~/.ssh/id_rsa已注入,且~/.ssh/config包含对应 Host 别名和 StrictHostKeyChecking no - 本地
go mod download成功但 CI 失败 → 很可能 CI 环境没设GOPRIVATE,或 Git 凭据未透传
一个快速验证方式:在 CI 机器上手动执行 git clone https://git.company.com/team/utils.git,失败则说明是 Git 层问题,不是 Go 配置问题。
真正容易被忽略的是:不同 Go 版本对 GOPRIVATE 的默认行为略有差异(如 1.13 开始引入,1.16 起默认启用),线上构建机若混用 Go 版本,必须显式声明变量,不能依赖“应该可以”。









