答案:403或unknown revision主因是未配置goprivate导致go误走代理,须设goprivate=git.example.com/**跳过代理与签名校验,并确保git层认证(https证书或ssh密钥)正常。

go get 报 403 或 unknown revision 怎么办
根本不是权限配置错了,而是 Go 工具链在你没设 GOPRIVATE 的时候,把私有模块路径当成公共模块,强行走 proxy.golang.org 或你配的镜像源,结果对方服务器直接拒了请求。
必须让 Go 明确知道“这个路径不走代理、不校验签名、不转发给第三方”:
-
GOPRIVATE=git.example.com/**(注意双星号匹配任意深度子路径) - 多个域名用逗号分隔:
GOPRIVATE=git.example.com/**,gitee.com/my-org/* - 不能写
*.example.com—— Go 不支持域名通配,只认路径前缀
设完后执行 go env GOPRIVATE 确认生效,再跑 go mod tidy。如果还报错,大概率是 Git 层认证没过,不是 Go 的问题。
HTTPS 私有仓库拉取失败:x509 certificate signed by unknown authority
GOPRIVATE 只跳过代理和模块校验,不跳 TLS 证书验证。内网 Git 服务用自签名证书时,Go 默认拒绝连接。
生产环境别用 GOINSECURE,改用 Git 自身的 SSL 配置:
- 把内网 CA 证书加进系统信任链(Linux:/etc/ssl/certs/ca-certificates.crt;macOS:钥匙串)
- 或告诉 Git 用指定 CA:
git config --global http."https://git.example.com/".sslCAInfo /path/to/internal-ca.crt
验证方式:手动跑 git clone https://git.example.com/group/lib 成功了,go mod tidy 才可能成功。Go 底层调的是 git,不是自己发 HTTP 请求。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
SSH 协议下 go mod tidy 卡住或报 permission denied
Go 不处理 SSH 认证,全交给 git。常见卡点是 ssh-agent 没加载密钥,或远程仓库没配公钥。
检查三件事:
-
ssh -T git@git.example.com能否连通并返回欢迎信息 -
eval $(ssh-agent)&&ssh-add ~/.ssh/id_rsa是否执行过(尤其 CI 环境容易漏) -
~/.gitconfig里有没有 URL 重写规则:[url "git@git.example.com:"] insteadOf = https://git.example.com/
没这条 insteadOf,Go 默认仍走 HTTPS 协议,哪怕你 go.mod 里写的是 git.example.com/group/lib —— 它会尝试 HTTPS 克隆,然后失败。
replace 指向本地路径,CI 构建失败
开发时写 replace github.com/mycorp/pkg => ./pkg 很方便,但提交到 Git 后,CI 机器上没有 ./pkg 目录,go mod tidy 直接崩。
正确做法:
- 本地开发保留
replace,但加注释说明用途,比如// dev-only: replace for local debugging - CI 流水线前加一步:临时删掉
replace行,再跑go mod tidy - 或者统一用伪版本(
v0.0.0-20240801120000-abcdef123456)打轻量 tag,避免依赖本地路径
真正容易被忽略的是:私有模块一旦被其他依赖间接引入,go list -m all 里会出现它,但 go.mod 未必显式 require —— 这时候 GOPRIVATE 必须覆盖完整路径,否则 go mod tidy 会在解析间接依赖时悄悄失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










