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

时间:2014-12-16 09:00:52

标签: git go

我正在寻找让$ 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不太好时都会这样做,是否还有其他?

14 个答案:

答案 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 上的私有存储库时出现问题。 我试图找到一个解决方案,我失去了几分钟。我确实找到了这个:

  1. 您需要获取私人令牌:
    https://gitlab.mycompany.com/profile/account

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

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

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
    
  4. 最后,您可以正常使用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 命令行工具不要将公共互联网资源用于主机名 列出(如公共模块代理)。

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

为了将来证明这些说明,请遵循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 冲突。

奖励:SSH 配置文件

为了经常使用 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的情况

参考:netrc man page


如果您想坚持使用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 answerAmmar 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

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

现在我可以浏览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:权限被拒绝(公钥)。 致命:无法从远程存储库读取。 请确保您具有正确的访问权限 并且存储库存在。

此解决方案需要什么

  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连接(如this article中所述)引起的。 OpenSSH调试日志显示与存储库的初始连接成功,但后来由于某种原因再次尝试了该操作,这在一定程度上支持了这一点,这次选择请求密码。

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

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

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

答案 11 :(得分:2)

设置GOPRIVATEgit config ...

之后

人们在获取私人资源时仍可能遇到这样的问题:

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

没有.git扩展名的用户不能使用私人仓库。

原因是go工具对这个仓库gitsvn或其他任何仓库的VCS协议一无所知,与github.comgolang.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

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:0)

我已经为这个问题写了long answer,但是它涵盖了通过ssh密钥访问而不是带有元标记的https访问的存储库。它涵盖了软件包和模块。它还提到了如何使用master以外的分支。

如果我错过了任何事情,请发表评论或回复