You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中使用不同SSH密钥拉取多个私有子模块

解决方案

问题原因

你原来的写法存在两个核心问题:

  • 重复调用actions/checkout动作时,第二次执行会重置工作区的Git状态与全局SSH配置,第一次配置的子模块拉取结果会被覆盖
  • actions/checkout的ssh-key参数是全局生效的Git SSH凭证,无法对应到单个子模块的独立权限配置

修复后的完整工作流配置

jobs:
  your-job-name:
    runs-on: ubuntu-latest
    steps:
      # 第一步:先拉取主仓库,不拉取子模块
      - uses: actions/checkout@v4
        with:
          submodules: false

      # 第二步:写入多份SSH密钥并配置SSH路由
      - name: 配置子模块专属SSH密钥
        run: |
          # 写入两个子模块对应的SSH私钥
          echo "${{ secrets.REPO_1 }}" > ~/.ssh/repo1_key
          echo "${{ secrets.REPO_2 }}" > ~/.ssh/repo2_key
          chmod 600 ~/.ssh/repo1_key ~/.ssh/repo2_key

          # 配置SSH主机规则,不同域名对应不同密钥
          cat > ~/.ssh/config << EOF
          Host repo1-github
            HostName github.com
            User git
            IdentityFile ~/.ssh/repo1_key
            StrictHostKeyChecking no
          Host repo2-github
            HostName github.com
            User git
            IdentityFile ~/.ssh/repo2_key
            StrictHostKeyChecking no
          EOF

      # 第三步:修改子模块远程地址匹配SSH路由规则
      - name: 替换子模块远程地址
        run: |
          # 请将下面的<子模块1本地路径>、<子模块1仓库地址>替换为你实际的配置
          git config submodule.<子模块1本地路径>.url git@repo1-github:<子模块1仓库地址>.git
          # 同理替换子模块2的配置
          git config submodule.<子模块2本地路径>.url git@repo2-github:<子模块2仓库地址>.git
          # 如果你不清楚子模块的路径和地址,可以查看项目根目录下的.gitmodules文件获取对应值

      # 第四步:拉取所有子模块
      - name: 拉取子模块
        run: git submodule update --init --recursive

注意事项

  • 存储到GitHub Secrets中的REPO_1、REPO_2必须是完整的私钥内容,包含首尾的-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----标记
  • 两个私钥对应的公钥需要分别添加到两个私有子模块仓库的部署密钥中,且要勾选读取权限
  • 如果不需要递归拉取子模块的嵌套子模块,可以去掉git submodule update命令的--recursive参数

内容的提问来源于stack exchange,提问作者This-is-patriiick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:30:04