从本地Git SSH仓库拉取模块的Golang实践

从本地Git SSH仓库拉取模块的Golang实践 抱歉在这里重复提问,但我遇到了一个错误,似乎在谷歌上找不到答案。

我的设置如下。我有一个本地托管的 Bitbucket 服务器,我的代码存放在上面,我希望能够将其他仓库作为 Go 模块拉取下来,这样我就不必在所有项目中使用混乱的 Git 子模块。我遵循了这里列出的建议:https://www.reddit.com/r/golang/comments/e9q2jr/private_repositories_with_onpremise_bitbucket/,总结起来就是:

  1. 告诉我的 Git 客户端对我的本地仓库使用 SSH 而不是 HTTPS
  2. 告诉 Go 我的-bitbucket.server 是一个私有仓库,应该免除校验和数据库检查,并且不通过代理访问(export GOPRIVATE=my-bitbucket.server.net >> ~/.zshenv)
  3. 确保我的 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

2 回复

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连接。

回到顶部