【问题标题】:How to git clone a private repo with a private submodule in a GitHub Action?如何在 GitHub 操作中使用私有子模块 git clone 私有仓库?
【发布时间】:2023-01-21 07:26:32
【问题描述】:
我的组织(或我的用户)内有两个私人 GitHub 存储库。其中一个包含另一个作为子模块。我怎样才能用它包含的子模块克隆这个其他私有存储库?
我试过了
- uses: actions/checkout@v3
with:
submodules: true
然而,这失败了,子模块部分出现了一条错误消息,是否有我应该添加或其他的权限?
Fetching submodules
/usr/bin/git submodule sync
/usr/bin/git -c protocol.version=2 submodule update --init --force --depth=1
Submodule '.github/workflows/MYPROJECT1' (https://github.com/MYUSER/MYPROJECT1.git) registered for path '.github/workflows/MYPROJECT1'
Cloning into '/home/runner/work/MYPROJECT2/MYPROJECT2/.github/workflows/MYPROJECT1'...
remote: Repository not found.
Error: fatal: repository 'https://github.com/MYUSER/MYPROJECT1.git/' not found
Error: fatal: clone of 'https://github.com/MYUSER/MYPROJECT1.git' into submodule path '/home/runner/work/MYPROJECT2/MYPROJECT2/.github/workflows/MYPROJECT1' failed
Failed to clone '.github/workflows/MYPROJECT1'. Retry scheduled
... more errors
【问题讨论】:
标签:
github
github-actions
git-submodules
【解决方案1】:
您可以尝试改用 SSH URL。
issue 116 "private submodule checkout fails" 现在(2022 年 7 月)说明了替代方案:
当您想要保持 URL 存储库的灵活性并仍然使用 GitHub Actions 和 Deploy Keys 来访问私有子模块时,此解决方案有效:
- name: Checkout
uses: actions/checkout@v3
- 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
Issue 287(“支持私有存储库和私有子模块”)还包括:
您可以使用 webfactory/ssh-agent action 为多个子模块存储库提供单独的部署密钥,如下所示:
...
steps:
- uses: actions/checkout@v3
- name: Add SSH private keys for submodule repositories
uses: webfactory/ssh-agent@0.7.0
with:
ssh-private-key: |
${{ secrets.SSH_PRIVATE_KEY_SUBMODULE_1 }}
${{ secrets.SSH_PRIVATE_KEY_SUBMODULE_2 }}
- run: git submodule update --init --recursive --remote
...
这对我有用,除了 --remote 导致它检查不正确的引用(子模块的 master,而不是引用的提交)。
只是做 git submodule update --init --recursive 让我得到了想要的行为