如何用GitHub Actions在他人仓库更新时拉取指定文件
GitHub Actions 跨仓库文件同步方案
需求清单
- 从目标仓库拉取指定文件,私有仓库支持Token认证
- 对拉取的部分文件执行重命名操作
- 自动在当前仓库创建PR提交更新
- 支持手动触发和源仓库更新自动触发
- 适配GitHub对旧版Node的限制,使用最新Node环境
核心问题解决:源仓库更新触发当前Workflow
GitHub Actions无法直接监听外部仓库的更新事件,需通过仓库间事件触发实现:在源仓库配置一个Workflow,当源仓库有代码推送时,向当前仓库发送repository_dispatch事件,触发当前仓库的同步流程。
完整配置代码
1. 当前仓库的同步Workflow(.github/workflows/sync-files.yml)
name: 跨仓库文件同步 env: SOURCE_REPO: "some/repo" # 源仓库的owner/repo格式,不需要https前缀 AUTOMATIC_MONITOR: true FILES: "*.txt,LICENSE" # 要拉取的源文件,多文件用逗号分隔 FILES_NEW: "*.txt,LICENSE_some_repo" # 拉取后重命名的目标文件名 EXTRA: "mv LICENSE LICENSE_some_repo" # 重命名命令 USERNAME: ${{ github.actor }} ADDRESS_SUFFIX: "users.noreply.github.com" TOKEN_NAME: "SOURCE_REPO_ACCESS_TOKEN" # 当前仓库Secrets中存储的Token名称 SOURCE_BRANCH: "main" # 源仓库要监听的分支 TARGET_BRANCH: "main" # 当前仓库的目标分支 on: workflow_dispatch: # 手动触发 inputs: source_branch: description: "指定源仓库分支(可选,默认使用env中的SOURCE_BRANCH)" required: false repository_dispatch: # 源仓库触发事件 types: [source_repo_updated] # 事件类型,需和源仓库配置一致 jobs: sync-files: runs-on: ubuntu-latest steps: - name: 检查自动监听开关 if: ${{ github.event_name != 'workflow_dispatch' && env.AUTOMATIC_MONITOR == 'false' }} run: exit 1 - name: 配置最新Node环境 uses: actions/setup-node@v4 with: node-version: latest - name: 检出当前仓库代码 uses: actions/checkout@v3 with: ref: ${{ env.TARGET_BRANCH }} - name: 拉取并处理源仓库文件 env: SOURCE_TOKEN: ${{ secrets[env.TOKEN_NAME] }} EVENT_SOURCE_BRANCH: ${{ github.event.inputs.source_branch || env.SOURCE_BRANCH }} run: | # 构建源仓库克隆地址,私有仓库用Token认证 if [ -n "$SOURCE_TOKEN" ]; then REPO_URL="https://$SOURCE_TOKEN@github.com/${SOURCE_REPO}.git" else REPO_URL="https://github.com/${SOURCE_REPO}.git" fi # 克隆源仓库指定分支(浅克隆提升速度) git clone --depth 1 -b $EVENT_SOURCE_BRANCH $REPO_URL source-repo cd source-repo # 执行重命名操作 $EXTRA # 复制处理后的文件到当前仓库根目录 cp -u $FILES_NEW ../ cd .. # 清理临时克隆的源仓库 rm -rf source-repo - name: 提交更新 run: | git config user.name "$USERNAME" git config user.email "$USERNAME@$ADDRESS_SUFFIX" git add $FILES_NEW # 检查是否有变更,避免空提交 if git diff --staged --quiet; then echo "无文件变更,跳过提交" exit 0 fi git commit -m "同步源仓库${SOURCE_REPO}(${EVENT_SOURCE_BRANCH})的文件" - name: 创建Pull Request uses: peter-evans/create-pull-request@v5 with: base: ${{ env.TARGET_BRANCH }} head: "sync-branch/${SOURCE_REPO}" title: "同步源仓库${SOURCE_REPO}的文件更新" body: | 自动同步源仓库${SOURCE_REPO}(${EVENT_SOURCE_BRANCH})的以下文件: - ${{ env.FILES_NEW }}
2. 源仓库的触发Workflow(.github/workflows/trigger-sync.yml)
如果需要源仓库更新时自动触发同步,需在源仓库添加此配置:
name: 触发目标仓库同步 env: TARGET_REPO: "your-username/your-target-repo" # 你的目标仓库owner/repo格式 TOKEN_NAME: "TARGET_REPO_DISPATCH_TOKEN" # 源仓库Secrets中存储的Token,需有目标仓库的repo权限 on: push: branches: - main # 源仓库要监听的分支 paths: - "*.txt" # 只监听指定文件的更新,可根据需求调整 - "LICENSE" jobs: trigger-sync: runs-on: ubuntu-latest steps: - name: 发送同步触发事件 uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets[env.TOKEN_NAME] }} repository: ${{ env.TARGET_REPO }} event-type: source_repo_updated
关键配置说明
Token配置
- 当前仓库:创建名为
SOURCE_REPO_ACCESS_TOKEN的Secret,值为有权限拉取源私有仓库的Personal Access Token(PAT),需勾选repo权限 - 源仓库:创建名为
TARGET_REPO_DISPATCH_TOKEN的Secret,值为有权限向目标仓库发送repository_dispatch事件的PAT,需勾选repo权限
- 当前仓库:创建名为
触发逻辑
- 手动触发:通过GitHub仓库的Actions页面,选择
跨仓库文件同步Workflow,点击Run workflow,可指定源仓库分支 - 自动触发:源仓库指定分支的指定文件更新时,自动向目标仓库发送触发事件,启动同步流程
- 手动触发:通过GitHub仓库的Actions页面,选择
Node版本适配
- 使用
actions/setup-node@v4明确指定最新Node版本,避免GitHub环境中旧版Node的限制 actions/checkout@v3本身已适配最新Node环境,配合使用更稳妥
- 使用
PR自动创建
- 使用
peter-evans/create-pull-requestAction自动创建PR,代替直接push到目标分支,更符合Git工作流规范 - 自动生成PR标题和描述,清晰展示同步内容
- 使用
内容的提问来源于stack exchange,提问作者LWC
相关产品推荐
相关产品推荐

