我正在寻找获得$ 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不太好,有没有其他方法?
对于独立/最终回购,作为快速修复,为什么不直接在go中命名模块呢?Mod作为一个包使用贵公司的域名…?
module go.yourcompany.tld/the_repo
Go.yourcompany.tld甚至不必作为有效(子)域名存在…
同样,在同一个地方。mod你可以使用替换块/行来使用之前以同样的方式克隆的私有回购(在$GOPATH/src/go.yourcompany.tld中克隆的各自文件夹中)(为什么我们必须在GitHub中依赖太多?)
Edit
不用说,私人回购通常应该是私人回购,通常是标准的git回购,对吧?有了这些,为什么不直接克隆git,然后进入克隆文件夹?
我已经创建了一个特定于用户的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。
对于我来说,其他人提供的解决方案在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
但就像我说的,对我来说这行不通,也许我做错了