如何通过GitHub Workflows实现子模块推送时触发主仓库推送
子模块推送后自动更新主仓库的GitHub Workflows实现方案
当你推送子模块代码后,要让主仓库自动更新子模块的引用并完成推送,需要分两步配置两个仓库的Workflow:
1. 子模块仓库:推送时触发主仓库的更新事件
在子模块仓库的.github/workflows目录下创建trigger-main-update.yml文件,配置推送触发事件,向主仓库发送更新信号:
name: 触发主仓库更新子模块 on: push: branches: [ main ] # 替换成你要监听的子模块分支 jobs: trigger-update: runs-on: ubuntu-latest steps: - name: 向主仓库发送更新事件 uses: peter-evans/repository-dispatch@v2 with: token: ${{ secrets.PAT_WITH_REPO_ACCESS }} repository: 你的用户名/主仓库名称 event-type: submodule-updated client-payload: '{"submodule_sha": "${{ github.sha }}"}'
关键说明
PAT_WITH_REPO_ACCESS是拥有主仓库和子仓库repo权限的个人访问令牌,需要存在子仓库的Secrets中。repository字段要替换成你的主仓库完整路径(比如octocat/my-main-repo)。
2. 主仓库:接收事件并更新子模块引用
在主仓库的.github/workflows目录下创建update-submodule.yml文件,监听来自子模块的更新事件,执行拉取子模块最新代码、提交并推送的操作:
name: 更新子模块引用 on: repository_dispatch: types: [submodule-updated] jobs: update-submodule: runs-on: ubuntu-latest steps: - name: 拉取主仓库代码 uses: actions/checkout@v4 with: submodules: true token: ${{ secrets.PAT_WITH_REPO_ACCESS }} # 用于推送主仓库变更 - name: 更新子模块到最新提交 run: | git submodule update --remote 你的子模块相对路径 # 替换成实际子模块路径 git config user.name "GitHub Actions" git config user.email "actions@github.com" git add 你的子模块相对路径 git commit -m "更新子模块至提交 ${{ github.event.client_payload.submodule_sha }}" || echo "无变更需要提交" - name: 推送主仓库变更 run: git push origin main if: success()
额外注意事项
- 如果子模块使用特定分支而非默认分支,需要在
git submodule update --remote后加上--checkout参数,确保切换到对应分支的最新提交:git submodule update --remote --checkout 你的子模块路径。 - 若主仓库存在子模块引用的本地修改,Workflow可能会因冲突失败,建议团队内约定子模块更新流程,或在Workflow中添加冲突处理(比如先拉取最新主仓库代码再更新)。
- 可以根据需求调整触发分支,比如监听子模块的多个分支推送事件。
内容的提问来源于stack exchange,提问作者Ilir
相关产品推荐
相关产品推荐

