在 Go 语言中引用私有 Git 仓库

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2025/02/08/using-private-git-repository-in-golang/

简单记录下 Go 语音里如何从私有 Git 仓库安装、引用代码。

当使用 go get 命令获取一个私有(非公开访问)的 Git 仓库时,身份验证问题或者网络限制问题会导致 go 命令无法获取到代码。

要解决这个问题,其实就是解决两个问题:

  1. 令 go 工具链认识到指定域是私有域,不要通过其公网代理去访问(go 工具链默认会通过公共代理 sum.golang.org 去检查指定的仓库是否可用)
  2. 令 go 工具链获得私有仓库的访问权限,不论是通过 HTTPS 协议还是通过 SSH 协议。

1. 令 go 工具链认识到指定域是私有域

通过设置 GOPRIVATE 变量,将私有 Git 仓库服务器的主机名告诉 go 命令

1export GOPRIVATE=git.domain1.com,git.domain2.com

建议添加到 ~/.bash_profile 里。

配置完成后,go 命令在尝试获取来自这些域的代码时,会直接访问,而不会通过代理。

2. 给予 go 工具链访问私有仓库的权限

由于 Go 本身是通过 git 命令获取代码的,所以只要保证 git 命令可以访问私有仓库,go 命令也就可以了。

比如执行 go get your-domain.com/username/repo-name 命令时,go 命令会通过以下命令去获取代码:

1git clone https://your-domain.com/username/repo-name.git

那么假如其实可以通过配置 git 命令,令其改成通过 ssh 协议访问即可:

1YOUR_DOMAIN=your-domain.com
2
3git config \
4    --global url."git@$YOUR_DOMAIN:".insteadOf "https://$YOUR_DOMAIN/"

以上命令强制 git 命令将 https://$YOUR_DOMAIN/ 替换为 git@$YOUR_DOMAIN: 比如将 https://your-domain.com/username/repo-name.git 替换为 [email protected]:username/repo-name.git

又或者你想使用 HTTPS 协议,但是也需要身份验证,那么可以采用相似的方法,把身份验证信息添加到 URL 中:

1YOUR_DOMAIN=your-domain.com
2YOUR_USERNAME=your-username
3YOUR_PASSWORD=your-password # 也可能是 API Token
4
5git config \
6    --global url."https://$YOUR_USERNAME:$YOUR_PASSWORD@$YOUR_DOMAIN/".insteadOf "https://$YOUR_DOMAIN/"

OVER.

comments powered by Disqus

翻译: