【问题标题】:How to use Go with a private GitLab repo如何在私有 GitLab 存储库中使用 Go
【发布时间】:2015-06-24 19:20:22
【问题描述】:

GitLab 是一种免费的开源方式来托管私有 .git 存储库,但它似乎不适用于 Go。当你创建一个项目时,它会生成一个表单的 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"

有没有办法让它工作?

【问题讨论】:

  • go get 不是这样工作的,它使用导入路径,而不是直接 scm uris。你的 gitlab 是否有 https git 访问权限(如 github)?
  • 我不确定。它是通过以下过程安装的:cloud.google.com/solutions/gitlab。有没有办法告诉我?
  • 我对 gitlab 不是很熟悉,但我知道他们在公共项目中添加了对 go get 的支持:github.com/gitlabhq/gitlabhq/pull/5958。在最坏的情况下,您始终可以手动将 repo 的初始克隆复制到您的 GOPATH 中
  • 很遗憾,我必须为此使用私人仓库。我现在使用的是“最坏情况”:)。

标签: git go get package gitlab


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      使用 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】:

        我通常的做法是:

        确保您使用的是 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
        

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

          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
          

          【讨论】:

          • 创建 .netrc 文件解决了我在 ubuntu 中的问题
          【解决方案6】:

          运行这个命令:

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

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

          我使用 go 版本 1.6.2、1.8 和 1.9.1 对此进行了测试。

          【讨论】:

            【解决方案7】:

            作为记录,这在使用 gitlab 7.3.2 的 go 之外有效,并且正如 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

            【讨论】:

            • 请注意。尽管 bug 已关闭,但问题仍然存在。
            • @JamesFreman 我在 gitlab 8.2 上,但仍在获取 http url。知道发生了什么吗?
            【解决方案8】:

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

            1. 创建一个 SSH 密钥对。确保不要覆盖默认保存在 ~/.ssh/ 中的现有对。

              ssh-keygen -t rsa -b 4096
              
            2. 在您的 Gitlab 项目中创建一个新的秘密变量。使用SSH_PRIVATE_KEY 作为Key,你的private 键的内容作为Value

            3. before_script 修改您的.gitlab-ci.yml

              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. 将步骤 1 中创建的密钥对中的 public 密钥作为 Deploy Key 添加到您需要的项目中 go get

            【讨论】:

            • 很遗憾,我无法验证这是否有效,因为我目前没有使用 gitlab。如果有人可以验证这一点,我会将其标记为答案。
            • 谢谢@JamesFremen,我不知道有人会喜欢它,但我有几个人问过我,它似乎运作良好。
            • 在我向before_script 部分添加了一行之后,这对我有用:- git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"
            【解决方案9】:

            Gitlab 本身就支持go get

            go get 将向您提供的 url 发出一个 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 并查看源代码并查找元标记来测试网址。

            【讨论】:

            • 我也发布了一个答案.. gitlab 7.9 中似乎有一个修复。
            • 感谢您的所有帮助。希望在不久的将来一切顺利
            【解决方案10】:

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

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

            【讨论】:

            • 他说的是gitlab,不是github。 Gitlab 是一个用于私有存储库托管的开源项目。
            【解决方案11】:

            如果go get 无法获取 repo,您​​始终可以直接使用 git 进行初始克隆:

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

            这些工具随后将正常工作,预计 go get -u 将需要 -f 标志,因为 git 远程与规范导入路径不匹配。

            【讨论】:

            • 是的,我认为这是我目前正在使用的解决方法。
            猜你喜欢
            • 1970-01-01
            • 2015-07-24
            • 2022-01-23
            • 2014-08-19
            • 2022-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多