直接设goprivate=gitee.com并配置git全局url重写(git config --global url."git@gitee.com:".insteadof "https://gitee.com/"),即可解决90%的gitee私有包拉取失败问题,二者缺一不可。

直接设 GOPRIVATE 并配好 Git URL 重写,90% 的 Gitee 私有包拉取失败问题当场解决。不用动 go env -w GOPROXY,也不用加 -insecure —— 那只是掩盖证书或认证问题,不是根治。
为什么 go mod tidy 报 “unknown revision” 或 “404 Not Found”
Go 工具链默认把所有模块都往 proxy.golang.org 和 sum.golang.org 上送,但 Gitee 私有仓库既不在公共代理里,也没公开 checksum,所以会卡在两处:
-
go get尝试走 HTTPS 拉取,但没带认证凭据(token 或 SSH key),Gitee 返回 404 - 即使能拉到代码,
go build仍要校验sum.golang.org,而私有模块没在那里注册,直接失败
根本不是“Gitee 不支持 Go Module”,而是 Go 默认不认为它是私有源 —— 必须显式告诉它:“这个域名下的模块,别走代理、别查 sum、直接用 git 拉”。
必须设置 GOPRIVATE=gitee.com
这是最轻量也最关键的一步。只写 gitee.com 就够了,不需要加 /* 或 ** —— Go 对单域名匹配是前缀式,gitee.com/your-org/repo 自动命中。
- Linux/macOS:在
~/.zshrc或~/.bashrc里加export GOPRIVATE=gitee.com - Windows PowerShell:
$env:GOPRIVATE="gitee.com" - 验证是否生效:
go env GOPRIVATE应输出gitee.com
注意:GOPRIVATE 是纯字符串匹配,不支持通配符如 *.gitee.com;如果还有其他私有源(比如公司内网 GitLab),用逗号拼接:export GOPRIVATE=gitee.com,git.example.com,中间**不能有空格**。
Git 必须能用 SSH 拉取 Gitee 私有库
Go 本身不处理认证,它调用系统 git 命令。如果你的 git clone git@gitee.com:xxx/yyy.git 失败,go mod tidy 一定失败。
- 确认已生成 SSH key 并添加到 Gitee 账户(
ssh -T git@gitee.com应返回欢迎信息) - 全局配置 HTTPS → SSH 重写:
git config --global url."git@gitee.com:".insteadOf "https://gitee.com/" - 检查是否生效:
git config --get-all url."git@gitee.com:".insteadOf应输出https://gitee.com/
别用 http.extraheader 加 token —— 它只对 HTTPS 生效,而你刚配了 SSH 重写;如果非要用 HTTPS,得配 git config --global http.https://gitee.com/.extraheader "AUTHORIZATION: Bearer xxx",但远不如 SSH 稳定。
别碰 replace,除非真在本地调试
replace 是临时开发手段,不是私有模块方案。写进 go.mod 后:
- CI 构建时若没设
GOPRIVATE,go mod download会去公共代理找,报错 - 别人 clone 你的项目,没配 SSH key 或
GOPRIVATE,直接编译不过 - 发布前必须删掉
replace行,否则模块版本不可复现
真正该打的 tag 是 v1.0.0 这种语义化版本,不是 v0.0.0-20240520123456-abcdef123456 —— 后者是 Go 自动生成的伪版本,只在没 tag 时 fallback 使用,不利于协作和发布。
最容易被忽略的是:Git 的 SSH 配置和 GOPRIVATE 必须同时生效,缺一不可。前者决定“能不能拿到代码”,后者决定“Go 让不让你拿”。两者之间没有缓存、不自动联动,改完任一配置都要重新跑一次 go mod tidy 验证。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











