我正在寻找让$ 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
是的,它没有看到meta标签,因为我不知道如何提供登录信息。
第二次尝试:
关注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
不太好时都会这样做,是否还有其他?
答案 0 :(得分:45)
正确的方法是手动将存储库放在正确的位置。存储库存在后,您可以使用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
答案 1 :(得分:40)
根据此链接 - https://gist.github.com/shurcooL/6927554 - 您需要配置两件事。该示例基于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
答案 2 :(得分:27)
我在go get
使用我们公司的 gitlab 上的私有存储库时出现问题。
我试图找到一个解决方案,我失去了几分钟。我确实找到了这个:
您需要获取私人令牌:
https://gitlab.mycompany.com/profile/account
配置git以使用您的私有令牌添加额外标头:
$ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
配置您的git以将请求从 ssh 转换为 http :
$ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
最后,您可以正常使用go get
:
$ go get gitlab.com/company/private_repo
答案 3 :(得分:8)
对于使用私人 GitLabs 的人,这里的片段可能会有所帮助:https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21
也粘贴在下面:
go
命令行工具需要能够从您的私有 GitLab 获取依赖项,但需要身份验证。
这假设您的私人 GitLab 托管在 privategitlab.company.com
。
推荐使用以下环境变量:
export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com
以上几行可能最适合您的 shell 启动,例如 ~/.bashrc
。
GO111MODULE=on
告诉 Golang 命令行工具您正在使用模块。我没有用不使用的项目对此进行测试
私有 GitLab 上的 Golang 模块。
GOPRIVATE=privategitlab.company.com
告诉 Golang 命令行工具不要将公共互联网资源用于主机名
列出(如公共模块代理)。
为了将来证明这些说明,请遵循this guide from the GitLab docs。
我知道 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
替换为在
上一节。
不要不要使用类似以下内容的方式设置全局 git 配置:
git config --global url."git@privategitlab.company.com:".insteadOf "https://privategitlab.company.com"
在撰写本文时,我相信 Golang 命令行工具不完全支持 SSH git,这可能会导致
与 ~/.netrc
冲突。
为了经常使用 git
工具,而不是 Golang 命令行工具,设置一个 ~/.ssh/config
文件很方便。
为此,请运行以下命令:
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
请注意上面的文件和目录的权限对于 SSH 在它的默认配置中工作是必不可少的 大多数 Linux 系统。
然后,编辑 ~/.ssh/config
文件以匹配以下内容:
Host privategitlab.company.com
Hostname privategitlab.company.com
User USERNAME_HERE
IdentityFile ~/.ssh/id_rsa
请注意上述文件中的空格很重要,如果不正确将使文件无效。
其中 USERNAME_HERE
是您的 GitLab 用户名,~/.ssh/id_rsa
是文件系统中 SSH private 密钥的路径。
您已经将其public 密钥上传到 GitLab。这是some instructions。
答案 4 :(得分:6)
看起来像GitLab issue 5769。
在GitLab中,由于存储库始终以
.git
结尾,因此我必须在存储库名称末尾指定.git
才能使其正常工作,例如:import "example.org/myuser/mygorepo.git"
和
$ go get example.org/myuser/mygorepo.git
看起来GitHub通过附加
".git"
来解决这个问题。
如果Added support for Go's repository retrieval. #5958提供,则应在“right meta tags are in place”中解决
虽然Go本身仍有问题:“cmd/go
: go get cannot discover meta tag in HTML5 documents”。
答案 5 :(得分:6)
我遇到.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
请参见this answer,了解其在Windows上专门用于Git的情况
如果您想坚持使用SSH身份验证,请屏蔽该请求以强制使用ssh
git config --global url."git@github.com:".insteadOf "https://github.com/"
设置git访问权限的更多方法:https://gist.github.com/technoweenie/1072829#gistcomment-2979908
答案 6 :(得分:4)
如果您已经使用SSH进行过git调试,则this answer的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/"
答案 7 :(得分:3)
我创建了一个特定于用户的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
在另一台服务器上,&#34; ssh-url&#34;是admin@domain.com:username/private-repo.git
,此服务器的条目是:
Host domain.com
HostName domain.com
User admin
IdentityFile ~/.ssh/id_domain_com
只是为了澄清您需要确保User
,Host
和HostName
设置正确。
现在我可以浏览go路径,然后浏览go get <package>
,例如go get main
,其中文件main/main.go
包含包(来自上一个示例)domain.com:username/private-repo.git
。< / p>
答案 8 :(得分:3)
生成github oauth令牌here并将您的github令牌导出为环境变量:
import React from "react";
import { withStyles } from "@material-ui/core/styles";
import AppBar from "@material-ui/core/AppBar";
import Toolbar from "@material-ui/core/Toolbar";
import Typography from "@material-ui/core/Typography";
const styles = {
flex: {
flexGrow: 1
}
};
const NavBar = ({ classes }) => {
return (
<AppBar position="static">
<Toolbar>
<Typography variant="title" color="inherit">
Test
</Typography>
</Toolbar>
</AppBar>
);
};
export default withStyles(styles)(NavBar);
将git config设置为使用基本身份验证网址:
export GITHUB_TOKEN=123
现在,您可以git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"
进行您的私人仓库了。
答案 9 :(得分:3)
以上所有内容都不适合我。克隆存储库工作正常,但仍然出现unrecognized import
错误。
因为它代表Go v1.13,我在文档中发现我们应该像这样使用GOPRIVATE变量:
GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME
答案 10 :(得分:3)
对我来说,其他人提供的解决方案在go get
git@gl.nimi24.com:权限被拒绝(公钥)。 致命:无法从远程存储库读取。 请确保您具有正确的访问权限 并且存储库存在。
此解决方案需要什么
如其他人所述:
git config --global url."git@github.com:".insteadOf "https://github.com/"
从我的./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连接(如this article中所述)引起的。 OpenSSH调试日志显示与存储库的初始连接成功,但后来由于某种原因再次尝试了该操作,这在一定程度上支持了这一点,这次选择请求密码。
但是,上述文章中提出的使用SSH连接多路复用的解决方案对我不起作用。作为记录,作者建议将受影响的conf添加到受影响主机的ssh配置文件中:
ControlMaster auto
ControlPersist 3600
ControlPath ~/.ssh/%r@%h:%p
但是如上所述,对我来说它没有用,也许我做错了
答案 11 :(得分:2)
设置GOPRIVATE
和git config ...
人们在获取私人资源时仍可能遇到这样的问题:
https fetch: Get "https://private/user/repo?go-get=1": EOF
没有.git
扩展名的用户不能使用私人仓库。
原因是go工具对这个仓库git
或svn
或其他任何仓库的VCS协议一无所知,与github.com
或golang.org
不同,它们是经过硬编码的进入go的来源。
然后,go工具将在提取您的私有存储库之前进行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
答案 12 :(得分:2)
尝试多种解决方案后,我的问题仍然存在。设置 ~/.netrc
和 SSH 配置文件后的最终解决方案是将以下行添加到我的 ~/.bash_profile
export GOPRIVATE="github.com/[organization]"
答案 13 :(得分:0)
我已经为这个问题写了long answer,但是它涵盖了通过ssh密钥访问而不是带有元标记的https访问的存储库。它涵盖了软件包和模块。它还提到了如何使用master以外的分支。
如果我错过了任何事情,请发表评论或回复