【问题标题】:Pulling from a private submodule github repository using a deploy key?使用部署密钥从私有子模块 github 存储库中提取?
【发布时间】:2022-07-22 21:28:40
【问题描述】:

我有一个私有 github 存储库(服务器)和另一个私有存储库(共享)作为子模块。由于它们都设置为私有,并且 github 不允许共享部署密钥 - 当我尝试运行子模块更新时,我收到以下错误:

错误:未找到存储库。致命:无法从远程读取 存储库。

请确保您拥有正确的访问权限和存储库 存在。

如果我在我的桌面上使用 github 范围的 SSH 密钥,它工作正常,但我显然不希望我的服务器可以访问我帐户上的所有存储库 - 所以我需要使用部署密钥。

如何使用 github 部署密钥更新子模块?

【问题讨论】:

    标签: git github


    【解决方案1】:

    actions/checkout issue 183 提出了几个选项:

    例如(待测试)

    您如何看待能够指定多个 ssh 密钥。例如:

    ssh-key: |
     ${{ secrets.my_main_repo_deploy_key }}
     ${{ secrets.my_other_repo_deploy_key }}
    

    我认为如果一个不起作用,它会回退并尝试下一个。需要明确的是,这目前不起作用 - 需要更新操作以支持它。

    或者:

    我已经使用部署密钥将 python 依赖项从另一个私有存储库“B”拉入到我们的存储库“A”的构建中。

    为此,我通过“A”中配置的秘密和“B”中的相应公钥设置了一个私钥,并使用以下步骤:

         - name: Setup access via public/private key.
           # Below command requires the FOOBAR_PRIVATE_KEY to be configured via github repository secrets.
           # Also the key's public part must be added to the foobar repository deploy keys.
           # A private/public key pair without password (required in this case) can be generated with ssh-keygen.
           # This part is used for the git/foobar part in requirements.txt
           run: |
             mkdir ~/.ssh
             echo "${{ secrets.FOOBAR_PRIVATE_KEY }}" > ~/.ssh/id_rsa
             chmod 600 ~/.ssh/id_rsa
    

    还有:

    在 GitHub 上,问题是我们需要为每个子模块一个键。 AFAIK PR #190 中的想法将只允许所有子模块使用一个键。
    但是如果我们有多个私有子模块,我们需要多个。

    您在 Maximilian Ehlers 的“Using private git submodules in GitHub CI”中有完整的解决方法。


    OP jon 加上the comments

    我得到了它的工作:我没有把“-----BEGIN OPENSSH PRIVATE KEY-----”和END放在秘密中;添加那些修复它。


    注意:尝试使用多个 SSH 密钥在您的工作站上复制它意味着使用 ~/.ssh/config 以在不同的主机条目下引用这些密钥。

    以“Enable Multiple SSH Key for GitHub on Windows 10”为例。


    注意:issue 116 "private submodule checkout fails @v2" 现在(2022 年 7 月)包括作为替代品:

    当您希望保持 URL 存储库的灵活性并仍然使用 GitHub Actions 和 Deploy Keys 访问私有子模块时,此解决方案适用:

      - name: Checkout
        uses: actions/checkout@v2
    
      - name: Clone Submodule
        run: |
            mkdir -p $HOME/.ssh
            echo '${{ secrets.SUBMODULE_REPO_DEPLOY_KEY }}' > $HOME/.ssh/ssh.key
            chmod 600 $HOME/.ssh/ssh.key
            export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/ssh.key"
            git submodule set-url <path-to-submodule> git@github.com:<organization/submodule>.git
            git submodule update --init --recursive
            git submodule set-url <path-to-submodule> https://github.com/<organization/submodule>.git
            unset GIT_SSH_COMMAND
    

    【讨论】:

    • 我不断收到“加载密钥”/home/runner/.ssh/id_rsa“:无效格式”,当我添加后尝试运行“更多 $HOME/.ssh/id_rsa”时,它只是打印出几行***。我完全按照“在 GitHub CI 中使用私有 git 子模块”教程进行操作。
    • @Jon 使用ssh-keygen -t rsa -P "" 重新生成(并注册)一组新密钥后重试(假设您没有将现有密钥用于其他任何事情)。如果还是不行,用ssh-keygen -t rsa -P "" -m PEMold format)切换格式
    • 谢谢!我得到它的工作,我没有把“-----BEGIN OPENSSH PRIVATE KEY-----”和END放在秘密中,添加那些修复它。非常感谢
    • @Jon 太好了!做得好。我已将您的评论包含在答案中以提高知名度。
    • 现在我该如何拉取对子模块的更改?因为在我的服务器上拉取更改不会更新共享模块所在的文件夹