答案是Go未尝试认证导致unknown revision或404,因未用GOPRIVATE显式声明私有路径前缀,致其被当公开模块跳过git凭据流程;需正确配置GOPRIVATE(如git.example.com/*)、.netrc权限及machine匹配、SSH路径或git URL重写,并配合GOINSECURE处理自签名证书。

go mod download 报 unknown revision 或 404
根本不是权限配置错了,而是 Go 根本没尝试认证——它把私有仓库当公开模块处理,直接跳过 git 凭据流程。必须用 GOPRIVATE 显式声明路径前缀,否则 go get 永远不会调用 git clone 带上你的 token 或 SSH 密钥。
常见错误:
-
GOPRIVATE=*.example.com→ Go 不支持域名通配,必须写成git.example.com/** -
GOPRIVATE=git.example.com/→ 缺*或**,无法匹配子路径如git.example.com/team/lib -
go env -w GOPRIVATE="git.example.com/**, my.org/*"→ 逗号后空格导致第二项被截断
验证是否生效:运行 go env GOPRIVATE,输出应为完整字符串;再执行 go list -m all,若仍报 verifying: checksum mismatch,说明未命中匹配规则。
HTTPS 场景下 git clone 成功但 go get 失败
Go 调用的是系统 git 命令,但只在 HTTPS 协议下读取 ~/.netrc(Linux/macOS)或 %USERPROFILE%/_netrc(Windows)。如果 git clone https://git.example.com/team/lib 手动能通,go get 却失败,大概率是凭据文件没被 git 读到。
立即学习“go语言免费学习笔记(深入)”;
检查要点:
-
.netrc权限必须是600(chmod 600 ~/.netrc),否则 git 忽略 -
machine值必须和模块路径的域名完全一致,比如模块是git.example.com/team/lib,就写machine git.example.com -
password字段填 Personal Access Token(GitLab/GitHub 需勾选read_repository),不是登录密码 - 不要在
go.mod的require行里硬写 token 到 URL 中(如https://token:x-oauth-basic@git.example.com/...),CI 环境会泄露且不可维护
SSH 协议拉取时提示 Permission denied (publickey)
Go 不自己处理 SSH,它调用 git,而 git 是否走 SSH 取决于你 go.mod 里写的模块路径协议。如果模块路径是 git.example.com/team/lib,默认走 HTTPS;要走 SSH,必须确保:
- 模块路径本身以
git@git.example.com:开头(不推荐,破坏可移植性) - 或在
~/.gitconfig中配置 URL 重写:[url "git@git.example.com:"] insteadOf = https://git.example.com/ -
ssh-agent已加载对应私钥:ssh-add -l能列出密钥 - 远程 Git 服务已添加该公钥,并确认仓库 SSH URL 格式为
git@git.example.com:team/lib.git
注意:GOPRIVATE 对 SSH 协议无影响,它只控制 Go 是否跳过代理和校验;SSH 认证成败完全由本地 ssh 和 git 配置决定。
设置了 GOPRIVATE 还报 x509 certificate signed by unknown authority
GOPRIVATE 不控制 TLS 校验,只绕过代理和 checksum。如果你的私有 Git 服务用的是自签名证书或内网 CA,git 默认仍会拒绝连接。
解决方式分场景:
- 开发环境临时绕过:
go env -w GOINSECURE="git.example.com"(仅限非生产) - 生产环境推荐:
git config --global http."https://git.example.com/".sslCAInfo /path/to/internal-ca.crt - 系统级信任:把内网 CA 证书加入操作系统信任链(如 Linux 的
/etc/ssl/certs/ca-certificates.crt)
关键点:Go 的 TLS 行为最终由 git 的 HTTP 配置驱动,不是 Go 自己的 HTTP 客户端。改了 GOINSECURE 却没改 git 配置,问题依旧。


















