GitHub Action中如何克隆含私有子模块的私有Git仓库?
报错根因
actions/checkout@v3 默认使用工作流内置的GITHUB_TOKEN做鉴权,这个token默认仅持有当前运行工作流的主仓库的访问权限,没有权限拉取同账号/组织下的其他私有仓库,所以子模块克隆阶段会返回Repository not found错误,本质是权限不足,不是仓库地址真的不存在。
可落地的解决方法
方法1:传入具备多私有仓库访问权限的PAT(适配个人账号/所有组织场景)
- 生成GitHub Personal Access Token(PAT),权限勾选完整的
repo域权限,确认PAT所属账号同时拥有主仓库、子模块私有仓库的拉取权限 - 将生成的PAT保存到主仓库的Actions Secrets中,例如命名为
REPO_ACCESS_TOKEN - 修改checkout步骤配置,传入自定义token:
- uses: actions/checkout@v3 with: submodules: true token: ${{ secrets.REPO_ACCESS_TOKEN }}
配置后checkout动作会自动将传入的token用于所有子模块的拉取鉴权,不需要额外手动配置git认证规则。
方法2:同组织仓库直接放开内置GITHUB_TOKEN权限(无需额外生成PAT)
如果主仓库和子模块归属于同一个GitHub组织,可以直接调整组织配置让内置token拥有跨仓库访问权限:
- 进入组织设置的「Actions - General」配置页
- 找到Workflow permissions板块,勾选允许GitHub Actions访问组织内所有仓库的选项,保存配置
- 在工作流文件顶层添加全局权限声明:
permissions: contents: read
配置完成后原有submodules: true的配置就可以正常拉取私有子模块,不需要额外传token。
补充说明
- 如果存在多层嵌套子模块,将
submodules: true替换为submodules: recursive即可递归拉取所有层级的子模块 - 如果需要拉取完整提交历史而非浅克隆,额外配置
fetch-depth: 0即可 - 禁止将PAT明文写在工作流文件中,必须通过Secrets注入使用
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

