“获取”私有存储库的正确方法是什么?


143

$ go get在许多Google尝试之后,我正在寻找使用私有存储库的方法。

第一次尝试:

$ go get -v gitlab.com/secmask/awserver-go
Fetching https://gitlab.com/secmask/awserver-go?go-get=1
https fetch failed.
Fetching http://gitlab.com/secmask/awserver-go?go-get=1
Parsing meta tags from http://gitlab.com/secmask/awserver-go?go-get=1 (status code 200)
import "gitlab.com/secmask/awserver-go": parse http://gitlab.com/secmask/awserver-go?go-get=1: no go-import meta tags
package gitlab.com/secmask/awserver-go: unrecognized import path "gitlab.com/secmask/awserver-go

是的,它没有看到元标记,因为我不知道如何提供登录信息。

第二次尝试:

跟随https://gist.github.com/shurcooL/6927554。将配置添加到.gitconfig。

[url "ssh://git@gitlab.com/"]
    insteadOf = https://gitlab.com/
$ go get -v gitlab.com/secmask/awserver-go --> not work
$ go get -v gitlab.com/secmask/awserver-go.git --> work but I got src/gitlab.com/secmask/awserer-go.git

是的,它可以工作,但是带有.git我的项目名称扩展名,我可以将其重命名为原始名称,但是每次$ go get都做得不太好,还有其他方法吗?


2
一旦遵循以下答案,请确保也导出GOPRIVATE。例如export GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

Answers:


91

您需要配置一件事。该示例基于GitHub,但这不应更改该过程:

$ git config --global url.git@github.com:.insteadOf https://github.com/
$ cat ~/.gitconfig
[url "git@github.com:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo

已经做到了,实际上这只是一个配置,cat命令仅用于验证。
secmask 2014年

1
这样做的唯一缺点是,您不能为每个主机(例如,如果您使用多个提供程序)使用不同的配置,而不必每次都更改全局git配置。然后最好像她描述的那样在«ssh-level»上进行指定:stackoverflow.com/questions/27500861/…–
Joachim

1
我希望这票获得更高的投票。即使是公共回购协议,我也尽可能使用ssh,因为有两个因素使密码身份验证很尴尬。这将所有github仓库修复为ssh url。谢谢!
captncraig

53

正确的方法是手动将存储库放在正确的位置。一旦存储库在那里,您就可以go get -u用来更新软件包并go install安装它。一个名为

github.com/secmask/awserver-go

进入

$GOPATH/src/github.com/secmask/awserver-go

您键入的命令是:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git

5
@secmask go get被设计为常见情况的工具。Go团队明确决定不增加可配置性,以使人们遵守标准,而不是自行开发。从未针对您的情况(即私人存储库)制作过该文件。
fuz 2014年

@Shudipta请停止编辑。问题看起来更糟,您想要的方式。
fuz

不错的文档。救了我一命。
阿尼什·瓦格斯

34

我在公司的gitlabgo get使用私有存储库时遇到问题。我花了几分钟试图找到解决方案。我确实找到了这个:

  1. 您需要在以下位置获取私人令牌:https :
    //gitlab.mycompany.com/profile/account

  2. 配置您的git以使用您的专用令牌添加额外的标头:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. 配置您的git以将请求从http转换为ssh

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. 最后,您可以go get正常使用:

    $ go get gitlab.com/company/private_repo

3
有趣的使用http.extraheader。+1
VonC

29
--global还您使用许多回购发送您的私人令牌等git的服务器呢?有任何安全风险吗?
secmask

有人对此有任何评论吗?我认为当我们继续使用它们时,它将把它发送到公共github
仓库

13

以上所有都不适合我。克隆存储库工作正常,但是我仍然遇到unrecognized import错误。

正如Go v1.13所代表的那样,我在文档中发现我们应该使用GOPRIVATE env变量,如下所示:

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME

10

如果您已经使用SSH进行过git 调试,那么Ammar Bandukwala的答案很简单:


$ go getgit内部使用。以下一线将制作git并因此$ go get通过SSH克隆您的软件包。

Github:

$ git config --global url."git@github.com:".insteadOf "https://github.com/"

BitBucket:

$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"

10

看起来像GitLab问题5769

在GitLab中,由于存储库始终以结尾.git,我必须.git在存储库名称的末尾指定名称以使其正常运行,例如:

import "example.org/myuser/mygorepo.git"

和:

$ go get example.org/myuser/mygorepo.git

看起来GitHub通过附加来解决了这个问题".git"

应该在“ 增加了对Go的存储库检索的支持 ”中解决该问题#5958 ”,前提是正确的元标记已到位
尽管Go本身仍然存在一个问题:“ cmd/go:go get无法发现HTML5文档中的元标记 ”。


实际上,他们(和其他人)已经支持meta标签,但是它仅适用于公共go get
仓库

@secmask,这就是您使用ssh:来提供凭据的原因。
VonC 2014年

哦,这只是一个选择,我可以使用http,https来go get执行,但是命令看起来像go get gitlab.com/secmask/awserver-go.git.git(将要求http基本身份验证),看起来也不太好。
secmask 2014年

8

在此处生成github oauth令牌并将您的github令牌导出为环境变量:

export GITHUB_TOKEN=123

将git config设置为使用基本身份验证网址:

git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"

现在您可以进行go get私人回购了。


5

我已经创建了用户特定的ssh-config,因此我的用户使用正确的凭据和密钥自动登录。

首先,我需要生成一个密钥对

ssh-keygen -t rsa -b 4096 -C "my@email.here"

并将其保存到例如~/.ssh/id_my_domain。请注意,这也是我连接到我的Github帐户的密钥对(私有和公开),因此我的存储在中~/.ssh/id_github_com

然后,我创建(或更改)了一个~/.ssh/config带有条目的文件:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_github_com

在另一台服务器上,“ ssh-url”为admin@domain.com:username/private-repo.git,该服务器的条目为:

Host domain.com
    HostName domain.com
    User admin
    IdentityFile ~/.ssh/id_domain_com

只是为了澄清,你需要确保UserHostHostName设置正确。

现在,我可以浏览到go路径,然后浏览go get <package>,例如go get main文件在哪里main/main.go包含软件包(来自上面的最后一个示例)domain.com:username/private-repo.git


您也可以直接使用以下命令导入软件包:(。go get hostname.com/username/repo.gitgit扩展名至关重要)。
约阿希姆

没有扩展.git,有没有办法做到这一点,为什么会发生呢?
Cristian Chaparro A.

1
有趣的是,没有.git扩展名的原因是我无法获得存储库,原因是在我本地的git配置上git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/",但是子域gitlab.myserver.com没有ssl认证,所以我现在使用http代替https
Cristian Chaparro

3

.netrc发现它与此有关。

创建~/.netrc具有以下内容的文件:

machine github.com
    login <github username>
    password <github password or Personal access tokens >

做完了!

此外,对于最新的GO版本,您可能需要将其添加到环境变量中GOPRIVATE=github.com (我已将其添加到.zshrc)中

netrc 这也使我的开发环境设置得更好,因为现在将我对HTTPS的个人github访问权限配置为可在计算机上使用(就像我的SSH配置一样)。

生成GitHub个人访问令牌:https : //github.com/settings/tokens

如果您想坚持使用SSH身份验证,请屏蔽该请求以强制使用ssh

git config --global url."git@github.com:".insteadOf "https://github.com/"

设置git访问的更多方法:https : //gist.github.com/technoweenie/1072829#gistcomment-2979908

有关在Windows上与Git一起使用的信息,请参见手册页此答案


2

对我来说,其他人提供的解决方案在 go get

git@gl.nimi24.com:权限被拒绝(公钥)。致命:无法从远程存储库读取。请确保您具有正确的访问权限,并且存储库存在。

该解决方案需要什么

  1. 正如其他人所说:

    git config --global url."git@github.com:".insteadOf "https://github.com/"

  2. 从我的./ssh/id_rsa密钥中删除密码短语,该密码短语用于验证到存储库的连接。可以通过在提示时输入一个空密码来完成以下操作:

    ssh-keygen -p

为什么这样做

这不是一个很好的解决方法,因为对您的私钥使用密码短语总是更好,但这会导致OpenSSH内部出现问题。

go get在内部使用git,后者使用openssh打开连接。OpenSSH从中获取进行身份验证所需的证书.ssh/id_rsa。当从命令行执行git命令时,代理可以为您打开id_rsa文件,这样您就不必每次都指定密码了,但是在go get的肚子里执行时,这在我的系统中不起作用案件。OpenSSH想要提示您输入密码,但是由于调用它的方式是不可能的,因此它将打印到调试日志中:

read_passphrase:无法打开/ dev / tty:没有这样的设备或地址

而只是失败。如果您从密钥文件中删除了密码,OpenSSH将在没有提示的情况下进入您的密钥,并且可以正常工作

可能是由于Go同时获取模块并同时打开与Github的多个SSH连接(如本文所述)引起的。OpenSSH调试日志显示与存储库的初始连接成功,但后来由于某种原因再次尝试了该操作,这在某种程度上支持了这一点,这次选择了密码。

但是,提到的文章中提出的使用SSH连接多路复用的解决方案对我不起作用。作为记录,作者建议将受影响的conf添加到受影响主机的ssh配置文件中:

  ControlMaster auto
  ControlPersist 3600
  ControlPath ~/.ssh/%r@%h:%p

但是如上所述,对我来说,它没有用,也许我做错了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.