从本地Git SSH仓库拉取模块的Golang实践
从本地Git SSH仓库拉取模块的Golang实践 抱歉在这里重复提问,但我遇到了一个错误,似乎在谷歌上找不到答案。
我的设置如下。我有一个本地托管的 Bitbucket 服务器,我的代码存放在上面,我希望能够将其他仓库作为 Go 模块拉取下来,这样我就不必在所有项目中使用混乱的 Git 子模块。我遵循了这里列出的建议:https://www.reddit.com/r/golang/comments/e9q2jr/private_repositories_with_onpremise_bitbucket/,总结起来就是:
- 告诉我的 Git 客户端对我的本地仓库使用 SSH 而不是 HTTPS
- 告诉 Go 我的-bitbucket.server 是一个私有仓库,应该免除校验和数据库检查,并且不通过代理访问(export
GOPRIVATE=my-bitbucket.server.net>> ~/.zshenv) - 确保我的 SSH 配置已设置好,可以通过 SSH 访问服务器(已经完成,并且已经正常工作了一段时间)
网上的一切信息都告诉我现在应该可以执行 go get 来获取我的代码了,但当我这样做时,我得到了以下 404 错误(不是困扰大多数人的 410 错误):
go get -v my-bitbucket.server.net/proj_name/repo_name
go get my-bitbucket.server.net/proj_name/repo_name: unrecognized import path "my-bitbucket.server.net/proj_name/repo_name": reading https://my-bitbucket.server.net/proj_name/repo_name?go-get=1: 404 Not Found
我理解 go-get 应该向 Go 客户端提供信息,告诉它从哪里获取仓库,但我原以为将其添加到 GOPRIVATE 会阻止这种初始查找行为。
我的 go env 输出如下:
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/user/Library/Caches/go-build"
GOENV="/Users/user/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/user/go/pkg/mod"
GONOPROXY="*.server.net"
GONOSUMDB="my-bitbucket.server.net"
GOOS="darwin"
GOPATH="/Users/user/go"
GOPRIVATE="*.server.net"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/user/gobin"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/user/gobin/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.17.1"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/5w/l_0n8ydd3478ysz8_59tfxf8qkd82n/T/go-build192723744=/tmp/go-build -gno-record-gcc-switches -fno-common"
更多关于从本地Git SSH仓库拉取模块的Golang实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html
go-get 首先发送 HTTP 请求 https://my-bitbucket.server.net/proj_name/repo_name?go-get=1,响应中的 meta 标签 <meta name="go-import" content="my-bitbucket.server.net/proj_name/repo_name git https://my-bitbucket.server.net/proj_name/repo_name.git"> 包含了仓库地址和版本控制工具信息。
然后使用该元信息来拉取仓库代码;在自定义的 git 服务器中,需要拦截 go-get 请求以自定义响应的 meta 标签。
更多关于从本地Git SSH仓库拉取模块的Golang实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据你的描述和错误信息,问题在于Go仍然尝试通过HTTPS访问你的私有仓库。GOPRIVATE设置正确,但Go仍然会尝试执行go-get元数据查询。以下是解决方案:
1. 配置Git强制使用SSH
在你的~/.gitconfig中添加以下配置:
git config --global url."ssh://git@my-bitbucket.server.net".insteadOf "https://my-bitbucket.server.net"
或者直接编辑~/.gitconfig文件:
[url "ssh://git@my-bitbucket.server.net"]
insteadOf = https://my-bitbucket.server.net
2. 验证SSH配置
确保你的SSH配置正确,测试SSH连接:
ssh -T git@my-bitbucket.server.net
3. 使用正确的导入路径格式
尝试使用完整的SSH URL格式:
go get -v ssh://git@my-bitbucket.server.net/proj_name/repo_name.git
4. 如果仍然有问题,创建go.mod文件
在你的项目中创建go.mod文件,然后添加依赖:
# 初始化模块
go mod init your-project
# 添加私有依赖
go mod edit -replace my-bitbucket.server.net/proj_name/repo_name=ssh://git@my-bitbucket.server.net/proj_name/repo_name.git
# 获取依赖
go get my-bitbucket.server.net/proj_name/repo_name
5. 使用GOVCS环境变量(Go 1.16+)
export GOVCS="my-bitbucket.server.net:git"
6. 完整示例代码
创建一个测试项目验证配置:
# 创建测试目录
mkdir test-private-module
cd test-private-module
# 初始化模块
go mod init example.com/test
# 添加私有仓库依赖
cat > main.go << 'EOF'
package main
import (
"fmt"
_ "my-bitbucket.server.net/proj_name/repo_name"
)
func main() {
fmt.Println("Private module imported successfully")
}
EOF
# 获取依赖
go mod tidy
7. 如果使用Go 1.13+,确保启用模块模式
export GO111MODULE=on
8. 调试命令
使用-x标志查看详细过程:
go get -x -v my-bitbucket.server.net/proj_name/repo_name
检查Go是否真的跳过了代理:
GOPROXY=direct go get -v my-bitbucket.server.net/proj_name/repo_name
关键点是Git的insteadOf配置,这告诉Git将所有对HTTPS URL的请求重定向到SSH URL。这样当Go尝试通过HTTPS访问时,Git会自动将其转换为SSH连接。

