我正在寻找获得$ go与私人存储库工作的方法,经过许多谷歌尝试。

第一次尝试:

$ 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。将config添加到.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不太好,有没有其他方法?


当前回答

我已经创建了一个特定于用户的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

澄清一下,您需要确保正确设置了User、Host和HostName。

现在我可以浏览到go路径,然后去get <package>,例如去get main文件main/main。Go包含包(来自上一个例子)domain.com:username/private-repo.git。

其他回答

在尝试了多种解决方案后,我的问题仍然存在。设置~/.netrc和SSH配置文件后的最终解决方案是在~/.bash_profile中添加以下行

出口GOPRIVATE = " github.com/(组织)”

确保你删除了你之前的gitconfig,我也有同样的问题。

之前我执行了令牌过期的gitconfig,当你下次使用新令牌执行命令时,一定要删除之前的令牌。

以上所有的方法对我都不起作用。克隆回购工作正确,但我仍然得到一个无法识别的导入错误。

因为它代表Go v1.13,我在文档中发现我们应该像这样使用GOPRIVATE env变量:

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

我有一个问题,从我们公司的gitlab使用私人存储库。 我花了几分钟试图找到解决办法。我找到了这个:

你需要获得一个私人令牌: https://gitlab.mycompany.com/profile/account 配置你的git添加额外的头与你的私有令牌: $ git配置——global http。"PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN" 配置你的git将请求从http转换为ssh: $ git配置——全局url."git@gitlab.mycompany.com:". insteadof "https://gitlab.mycompany.com/" 最后你可以正常使用你的go get: $ go get gitlab.com/company/private_repo

对于我来说,其他人提供的解决方案在go get时仍然给出了以下错误

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

这个解决方案需要什么

如其他人所述: git配置——全局url."git@github.com:". insteadof "https://github.com/" 从我的。/ssh/id_rsa密钥中删除密码短语,该密钥用于验证到存储库的连接。这可以通过在提示时输入空密码来完成: ssh - keygen - p

为什么会这样

这不是一个很好的解决办法,因为在您的私钥上有一个密码短语总是更好的,但它在OpenSSH内部的某个地方引起了问题。

go get uses internally git, which uses openssh to open the connection. OpenSSH takes the certs necessary for authentication from .ssh/id_rsa. When executing git commands from the command line an agent can take care of opening the id_rsa file for you so that you do not have to specify the passphrase every time, but when executed in the belly of go get, this did not work somewhy in my case. OpenSSH wants to prompt you then for a password but since it is not possible due to how it was called, it prints to its debug log:

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

然后就失败了。如果您从密钥文件中删除了密码短语,OpenSSH将在没有提示的情况下获取您的密钥,并且可以正常工作

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

然而,上述文章中提出的使用SSH连接多路复用的解决方案对我来说并不适用。为了记录,作者建议在受影响主机的ssh配置文件中添加以下conf:

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

但就像我说的,对我来说这行不通,也许我做错了