本指南适用于如下场景:
- 私有 GitLab 仓库访问路径:
https://git.8888.cn/... - 访问 GitLab 之前还有一层 nginx Basic Auth(浏览器灰色弹窗)
- Go 在执行
go mod tidy/go get时出现:
plain
go: unrecognized import path "...": 401 Unauthorized
go: missing go.sum entry ...
- Windows 环境,使用 Go Modules
1. 解决 Go 访问 HTTPS(Basic Auth)层的问题:配置 _netrc
Go 在访问 HTTPS 私有仓库时,会自动读取默认位置的 netrc 文件:
- Windows:
%USERPROFILE%\_netrc
1.1 创建 _netrc
在 PowerShell 中:
plain
notepad $env:USERPROFILE\_netrc
写入以下内容(不要加引号,不要加 .txt 后缀):
plain
machine git.8888.cn
login <你的 Basic Auth 用户名>
password <你的 Basic Auth 密码>
⚠️ 账号密码必须是"浏览器第一层灰色弹窗"要求的那一套,而不是 GitLab 登录表单的账号密码(如果两者不同)。
1.2 确认文件名正确
检查文件:
plain
Get-ChildItem $env:USERPROFILE | where Name -like "_netrc*"
输出必须是:
plain
_netrc
不能是:
_netrc.txt_netrc.ini_netrc (1)
1.3 验证 netrc 是否生效
plain
curl --netrc-file "$env:USERPROFILE\_netrc" -v https://git.8888.cn/liubin/asynq?go-get=1
成功条件:
- 显示
Server auth using Basic with user ... - HTTP 返回
200 OK - 响应里包含:
plain
<meta name="go-import" ...>
如果依然 401,说明账号密码不对。
2. 解决 git clone 步骤(Go 第 2 步):强制使用 SSH 而不是 HTTP
Go 读取 meta 标签后会执行:
plain
git clone http://git.8888.cn/liubin/asynq.git
为了避免再次触发 Basic Auth,需要让 Git 自动把 HTTP 转成 SSH。
2.1 配置 Git insteadOf
plain
git config --global url."git@git.8888.cn:".insteadOf "https://git.8888.cn/"
git config --global url."git@git.8888.cn:".insteadOf "http://git.8888.cn/"
效果:
- 所有仓库 URL
http(s)://git.8888.cn/...
自动替换为
git@git.8888.cn:...(SSH)
2.2 确认 SSH 能访问
plain
git ls-remote git@git.8888.cn:liubin/asynq.git
若能看到 refs 输出,说明 SSH 完全正常。
3. 配置 Go 的私有模块环境变量
避免 go proxy / sumdb 访问失败等问题:
plain
go env -w GOPRIVATE=git.8888.cn
go env -w GONOSUMDB=git.8888.cn
go env -w GONOPROXY=git.8888.cn
4. 清理并重新下载模块
在你的 Go 项目目录执行:
plain
go clean -modcache
go mod tidy
或者测试单模块:
plain
go mod download git.8888.cn/liubin/asynq@v1.0.0
成功后会自动补全 go.sum 条目,模块可以正常编译。
5. 常见错误说明
❌ go get http://git.8888.cn/...
错误:
plain
malformed module path "http://..."
➡️ 原因:Go module path 不能带 http://
正确写法:
plain
go get git.8888.cn/liubin/asynq
6. 整体流程图(总结)
plain
┌────────────────────────────────────────┐
│ 1. Go 访问 https://git.8888.cn │
│ → 通过 _netrc Basic Auth(解决 401)│
└───────────────┬────────────────────────┘
│
▼
┌────────────────────────────────────────┐
│ 2. Go 读取 meta 标签 │
│ 得到仓库地址:http://git..../asynq.git│
└───────────────┬────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ 3. Git insteadOf 将 http(s):// 替换为 SSH URL │
│ http://git.8888.cn/liubin/asynq.git │
│ ↓ │
│ git@git.8888.cn:liubin/asynq.git (SSH) │
└───────────────┬────────────────────────────────┘
│
▼
┌────────────────────────────────────────┐
│ 4. SSH 拉取仓库成功,Go 完成 download │
│ go mod tidy / go build 正常工作 │
└────────────────────────────────────────┘
✔ 最终效果
完成以上步骤后:
go mod tidy不再 401- 私有模块可正常下载
go.sum自动补全- 构建/运行都不再报错