如何使用私人Gitlab回购GoLang?

时间:2015-04-17 19:19:12

标签: git go get package gitlab

Gitlab是一种免费的,开源的方式来托管私有的.git存储库,但它似乎不适用于GoLang。创建项目时,它会生成以下格式的URL:

git@1.2.3.4:private-developers/project.git

其中:

  • 1.2.3.4是gitlab服务器的IP地址
  • private-developers是可以访问私人仓库的用户组

Golang 1.2.1似乎并不理解这种语法。

go get git@1.2.3.4:private-developers/project.git

结果:

package git@23.251.148.129/project.git: unrecognized import path "git@1.2.3.4/project.git"

有没有办法让它发挥作用?

11 个答案:

答案 0 :(得分:32)

运行此命令:

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

假设您拥有git clone存储库的正确权限,这将使go get适用于服务器1.2.3.4上的所有存储。

我使用版本1.6.2,1.8和1.9.1进行了测试。

答案 1 :(得分:10)

此问题现已在Gitlab 8中解决。*但仍然不直观。确实最困难的挑战是go get,以下步骤将帮助您克服这些挑战:

  1. 创建SSH密钥对。请务必不要覆盖~/.ssh/中默认保存的现有对。

    ssh-keygen -t rsa -b 4096
    
  2. 在Gitlab项目中创建一个新的秘密变量。使用SSH_PRIVATE_KEY作为密钥,将私有密钥的内容用作

  3. 使用.gitlab-ci.yml修改before_script

    before_script:
      # install ssh-agent if not already installed
      - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
      # run ssh-agent
      - eval $(ssh-agent -s)
      # add the SSH key stored in SSH_PRIVATE_KEY
      - ssh-add <(echo "$SSH_PRIVATE_KEY")
      # for Docker builds disable host key checking
      - mkdir -p ~/.ssh
      - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    
  4. 在您需要go get的项目中,将步骤1中创建的密钥对中的 public 密钥添加为 Deploy Key 。< / p>

答案 2 :(得分:7)

如果go get无法获取回购,您可以随时直接使用git进行初始克隆:

git clone git@gitlab:private-developers/project.git $GOPATH/src/gitlab/private-developers/project

这些工具将正常工作,期望go get -u需要-f标志,因为git remote与规范导入路径不匹配。

答案 3 :(得分:4)

使用Gitlab的最简单方法

before_script:
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/".insteadOf https://gitlab.com/
  - go env -w GOPRIVATE=gitlab.com/${CI_PROJECT_NAMESPACE}

在此处查看更多详细信息:https://docs.gitlab.com/ee/user/project/new_ci_build_permissions_model.html#dependent-repositories

答案 4 :(得分:2)

Gitlab本身支持go get

go get会向您提供的网址发出http请求,并查找指向确切源控制路径的元标记。

对于我的gitlab安装,这是mygitlabdomain.com/myProject/myRepo。对你而言,我认为这将是1.2.3.4/private-developers/project

不幸的是,它似乎只提供了http scm路径,而不是ssh路径,因此我必须输入我的凭据才能克隆。如果要更新为ssh url,则可以在克隆后轻松摆弄本地存储库中的遥控器。

您可以通过戳http://1.2.3.4:private-developers/project?go-get=1并查看来源并查找元标记来测试网址。

答案 5 :(得分:2)

GitLab 11.8+版和Go 1.13+版将通过使用您的GitLab个人令牌与BASIC auth一起使用。 转到Gitlab中的“设置”->“访问令牌”,添加个人访问令牌或使用现有的令牌。 在〜/ .netrc文件中,添加以下行:

machine <your GitLab domain> (e.g. gitlab.com)
login <your GitLab id>
password <your GitLab personal access token>

那么您应该可以本地获取。

如果需要在CI中进行构建,请在.gitlab-ci.yml文件中添加以下行:

before_script:
    - echo -e "machine <your GitLab domain>\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc

答案 6 :(得分:1)

对于记录,这可以在gitlab 7.3.2之外使用,并且正如JimB所观察到的,可以用作解决方法。我发现即使用gitlab注册了SSH密钥,我也会收到提示输入用户名/密码的信息:

git clone http://1.2.3.4/private-developers/project.git

或者我可以使用SSH等价物,因为我有一个用gitlab注册的SSH密钥,避免提示:

git clone git@1.2.3.4:private-developers/project.git

目前无法使用go。修复可能在7.9但我没有机会测试它: upcoming bugfix

答案 7 :(得分:1)

我通常的做法是:

确保您正在使用SSH。

完成后,您可以将git配置为使用ssh代替https

如果使用的是Mac OX。你可以运行vim〜/ .gitconfig 并添加

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

配置完成后即可运行

GOPRIVATE="gitlab.com/your_username_or_group" go get gitlab.com/name_or_group/repo_name

我希望有帮助。

答案 8 :(得分:0)

您可以设置您的git凭据,Go将使用它们:

  1. 在您的github上生成一个唯一的密码(设置中的某个位置)。
  2. git config credential.helper store
  3. echo https://your-github-username:your-generated-password@github.com >> ~/.git-credentials
  4. 利润。

答案 9 :(得分:0)

对于HTTPS私有gitlab存储库,@ Rick Smith就足够了。这是对HTTP存储库的补偿,首先运行命令:

git config --global url."git@mygitlab.com:".insteadOf "http://mygitlab.com/"

然后使用下面的go get命令来获取golang项目:

go get -v  -insecure  mygitlab.com/user/repo

答案 10 :(得分:0)

dep 5.2版开始,dep支持Gitlab私有存储库的私有存储库。

.netrc文件上,您可以提供Gitlab用户名和访问令牌以访问私有存储库。

  1. 在$ HOME目录中创建.netrc文件
$ touch $HOME/.netrc
  1. 使用Gitlab凭据编辑.netrc
machine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>

... (more private repositories if needed)
  1. 在您的Go资源库中,运行dep命令来解析私有软件包。在这种情况下,
$ dep ensure -v