“去拿”的正确方式是什么?私有存储库?

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

第一次尝试:

$ 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不太好,有没有其他方法?

242415 次浏览

你有一个东西要配置。这个例子是基于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

为了让Go模块工作(使用Go 1.11或更新版本),你还需要设置GOPRIVATE变量,以避免使用公共服务器获取代码:

export GOPRIVATE=github.com/private/repo

它看起来像GitLab 5769期

在GitLab中,由于存储库总是以.git结尾,我必须在存储库名称的末尾指定.git以使其工作,例如:

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

和:

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

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

它应该在" 增加了对Go的存储库检索的支持。# 5958 "中被解析,前提是正确的元标签就位. c。
尽管Go本身仍然存在一个问题:" cmd/go: go get不能发现HTML5文档中的元标签 " .

. 0 .

正确的方法是手动将存储库放在正确的位置。一旦存储库在那里,你可以使用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

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

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

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

并保存到e.g. ~/.ssh/id_my_domain。注意,这也是我连接到我的Github帐户的对偶(私有和公共),所以我的存储在__abc1中。

然后我创建(或修改)了一个名为~/.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使用我们公司的gitlab上的私有存储库。 我花了几分钟试图找到解决办法。我找到了这个

  1. 你需要在
    处获得一个私有令牌 https://gitlab.mycompany.com/profile/account < / p >

  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
    

生成一个github oauth令牌在这里,并导出你的github令牌作为一个环境变量:

export GITHUB_TOKEN=123

设置git配置为使用基本认证url:

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

现在你可以go get你的私人回购。

如果你已经有了使用SSH的git, 这个答案 by Ammar Bandukwala是一个简单的解决方案:


$ go get在内部使用git。下面的一行代码将使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/"

以上所有的方法对我都不起作用。克隆回购是正确的,但我仍然得到一个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

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

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

这个解决方案需要什么

  1. 如其他人所述:

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

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

    ssh-keygen -p < / p >

为什么会这样

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

go get使用内部git, git使用openssh打开连接。OpenSSH从.ssh/id_rsa中获取身份验证所需的certs。当从命令行执行git命令时,代理可以负责为您打开id_rsa文件,这样您就不必每次都指定密码短语,但是当在go get中执行时,这在我的案例中并不奏效。OpenSSH希望提示您输入密码,但由于它被调用的方式,这是不可能的,它打印到调试日志:

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

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

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

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

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

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

我遇到了.netrc,并发现它与此相关。

创建一个包含以下内容的文件~/.netrc:

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

完成了!

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

netrc也使我的开发环境设置更好,因为我个人的github访问HTTPS现在已配置为跨机器使用(就像我的SSH配置)。

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

具体参见这个答案在Windows上与Git一起使用

裁判:Netrc手册页


如果您希望坚持使用SSH身份验证,那么可以屏蔽请求以强制使用SSH

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


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

在设置了GOPRIVATEgit config ...之后

人们在获取私有资源时仍然会遇到这样的问题:

https fetch: Get "https://private/user/repo?go-get=1": EOF

他们不能使用私人回购没有.git扩展。

原因是go工具不知道这个回购的VCS协议,gitsvn或其他任何协议,不像github.comgolang.org它们是硬编码到go的源代码中。

然后,go工具将在获取私有repo之前执行https查询:

https://private/user/repo?go-get=1

如果你的私人回购不支持https请求,请使用replace直接告诉它:

require private/user/repo v1.0.0


...


replace private/user/repo => private.server/user/repo.git v1.0.0

https://golang.org/cmd/go/#hdr-Remote_import_paths

对于使用私有GitLabs的人,这里有一个片段可能会有所帮助:https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21

也贴在下面:

问题

go命令行工具需要能够从你的私有GitLab获取依赖项,但需要身份验证。

这假设你的私人GitLab托管在privategitlab.company.com

环境变量

建议使用以下环境变量:

export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com # this is comma delimited if using multiple private repos

上面的行可能最适合你的shell启动,比如~/.bashrc

解释

GO111MODULE=on告诉Golang命令行工具你正在使用模块。我还没有在不使用的项目中测试过这个功能 在私有GitLab上的Golang模块

GOPRIVATE=privategitlab.company.com告诉Golang命令行工具不要为主机名使用公共互联网资源

从您的私人GitLab获取个人访问令牌

为了将来证明这些说明,请遵循这个指南来自GitLab文档。 我知道read_api范围是Golang命令行工具工作所必需的,我可能怀疑read_repository为 好吧,但还没有确认这一点

设置~/.netrc

为了让Golang命令行工具验证到GitLab,最好使用~/.netrc文件。

使用实例创建不存在的文件。

touch ~/.netrc
chmod 600 ~/.netrc

现在编辑文件的内容以匹配以下内容:

machine privategitlab.company.com login USERNAME_HERE password TOKEN_HERE

其中USERNAME_HERE被替换为您的GitLab用户名,TOKEN_HERE被替换为在 前一节。< / p >

常见的错误

执行设置一个全局git配置,如下所示:

git config --global url."git@privategitlab.company.com:".insteadOf "https://privategitlab.company.com"
我相信在写这篇文章的时候,Golang命令行工具还不完全支持SSH git,这可能会导致 与~/.netrc冲突

附加条件:SSH配置文件

对于经常使用git工具,而不是Golang命令行工具,设置~/.ssh/config文件是很方便的。

.使用实例
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
请注意上述文件和目录的权限是SSH在默认配置下工作所必需的

然后,编辑~/.ssh/config文件以匹配以下内容:

Host privategitlab.company.com
Hostname privategitlab.company.com
User USERNAME_HERE
IdentityFile ~/.ssh/id_rsa

请注意上述文件中的空格很重要,如果不正确,将使文件无效。

其中USERNAME_HERE是你的GitLab用户名,~/.ssh/id_rsa是文件系统中SSH 私人密钥的路径。 你已经上传了它的公共键到GitLab。这里是一些指令.

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

export GOPRIVATE="github.com/[organization]"

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

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

对于独立/最终回购,作为快速修复,为什么不直接在go中命名模块呢?Mod作为一个包使用贵公司的域名…?

module go.yourcompany.tld/the_repo

go.yourcompany.tld甚至不必作为有效(子)域存在…

此外,在相同的go.mod中,你可以使用replacement块/行来使用之前以同样方式克隆的私有回购(在同样在$GOPATH/src/go.yourcompany.tld中克隆的各自文件夹中)(为什么我们必须过度依赖GitHub?)

编辑

  1. 不用说,私人回购通常应该是私人回购,通常是标准的git回购,对吧?有了这些,为什么不直接在克隆文件夹中git clonego get ?

我第一次尝试

[url "ssh://git@github.com/"]
insteadOf = https://github.com/


但在我的本地车里,它不管用。

我试着

ssh -t git@github.com

它显示我的SSH是好的。

最后,我解决了这个问题,告诉go get考虑所有的私有和使用ssh而不是HTTPS。

添加export GOPRIVATE=*

这是硬代码在Go Get。不是Git的原因。修改Go Source。
原因:
reportforimportdynamic Will Request: https://....go-get

// RepoRootForImportPath analyzes importPath to determine the
// version control system, and code repository to use.
func RepoRootForImportPath(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error) {
rr, err := repoRootFromVCSPaths(importPath, security, vcsPaths)
if err == errUnknownSite {
rr, err = repoRootForImportDynamic(importPath, mod, security)
if err != nil {
err = importErrorf(importPath, "unrecognized import path %q: %v", importPath, err)
}
}
if err != nil {
rr1, err1 := repoRootFromVCSPaths(importPath, security, vcsPathsAfterDynamic)
if err1 == nil {
rr = rr1
err = nil
}
}
所以将gitlab域添加到vcsPaths将ok。
下载go源代码:

vi ./src/cmd/go/internal/vcs/vcs.go

查看下面的代码:

var vcsPaths = []*vcsPath{
// GitHub
{
pathPrefix: "github.com",
regexp:     lazyregexp.New(`^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`),
vcs:        "git",
repo:       "https://{root}",
check:      noVCSSuffix,
},

添加代码如下,XXXX Is Your Domain:

    // GitLab
{
pathPrefix: "gitlab.xxxx.com",
regexp:     lazyregexp.New(`^(?P<root>gitlab.xxxx\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`),
vcs:        "git",
repo:       "https://{root}",
check:      noVCSSuffix,
},

编译和替换go。