准备工作:明确你的仓库
●主仓库 (Source Repo):这是你平时主要推送代码的仓库,也是触发自动同步的仓库。我们称之为 Repo-A。
●目标仓库 (Target Repo):这是需要被动接收更新的仓库。可以是一个或多个。我们称之为 Repo-B, Repo-C 等。
第一步:生成专用的 SSH 密钥
为了安全,我们不使用你个人的 SSH 密钥,而是为这个自动化流程生成一个全新的、专用的密钥。
- 打开你电脑上的终端(Terminal、Git Bash 或 PowerShell)。
- 首先,确保 .ssh 文件夹存在。 在终端运行以下命令,如果文件夹不存在,它会帮你创建:
-
Windows (在 PowerShell 中运行):
if (-not (Test-Path "$env:USERPROFILE\.ssh")) { New-Item -Path "$env:USERPROFILE\.ssh" -ItemType Directory } -
Mac / Linux:
mkdir -p ~/.ssh
- 接下来,运行相应的命令来为第一个目标仓库 (Repo-B) 生成密钥文件:
-
Windows (在 PowerShell 中运行):
ssh-keygen -t rsa -b 4096 -C "github-actions-1" -f "$env:USERPROFILE\.ssh\actions_repo_1" -
Mac / Linux:
ssh-keygen -t rsa -b 4096 -C "github-actions-sync-repo-b" -f ~/.ssh/actions_sync_key_repo_b
-
终端会提示你输入密码 (Enter passphrase)。请直接按回车键。
-
接着会提示你再次输入密码确认 (Enter same passphrase again)。请再次按回车键。
重要提示: 如果你有多个目标仓库(例如 Repo-C),你需要为每一个目标仓库重复第 3-5 步,并为每个密钥文件使用不同的名称(例如 actions_sync_key_repo_c)。
第二步:在“目标仓库”中配置部署密钥 (Deploy Key)
你需要让每一个目标仓库信任我们为它生成的那个专属密钥,并给予写入权限。
- 首先,获取为 Repo-B 生成的公钥内容。
-
Windows (在 PowerShell 中运行):
Get-Content $env:USERPROFILE\.ssh\actions_repo_1.pub | Set-Clipboard -
Mac / Linux:
cat ~/.ssh/actions_sync_key_repo_b.pub
-
打开浏览器,进入你的目标仓库 Repo-B 的 GitHub 页面。
-
进入 Settings > Security > Deploy keys。
-
点击 Add deploy key,在 Key 字段中粘贴刚刚复制的公钥内容,并勾选 Allow write access。
重要提示: 如果你有第二个目标仓库 Repo-C,你需要获取为 Repo-C 生成的那个独一无二的公钥(例如 actions_sync_key_repo_c.pub),并将其添加到 Repo-C 的 Deploy Keys 设置中。绝不要复用 Repo-B 的密钥。
第三步:在“主仓库”中配置秘密 (Secret)
现在,你需要将所有生成的私钥安全地存放在主仓库 Repo-A 中。
- 首先,获取为 Repo-B 生成的私钥内容。运行以下命令来查看并复制:
-
Windows (在 PowerShell 中运行):
Get-Content $env:USERPROFILE\.ssh\actions_repo_1 | Set-Clipboard -
Mac / Linux:
cat ~/.ssh/actions_sync_key_repo_b
- 将获取到的私钥内容添加到 Repo-A 的 Settings > Secrets and variables > Actions 中。
- Secret 名称: REPO_B_SSH_PRIVATE_KEY
- Secret 内容: (粘贴你刚刚复制的私钥内容)
重要提示: 如果你有第二个目标仓库 Repo-C,你需要将为 Repo-C 生成的那个独一无二的私钥(例如 actions_sync_key_repo_c),添加为一个新的 Secret。请确保为它起一个唯一的名字,例如 REPO_C_SSH_PRIVATE_KEY。
第四步:在“主仓库”中创建 Workflow 文件 最后一步,我们需要在主仓库 Repo-A 中创建一个文件,告诉 GitHub Actions 具体要做什么。我们现在将使用一个自定义脚本来推送代码,以便在推送前移除工作流文件。
-
在你的本地 Repo-A 仓库的根目录下,创建 .github/workflows/sync-repos.yml 文件。
-
将下面的 YAML 代码复制并粘贴到 sync-repos.yml 文件中。
.github/workflows/sync-repos.yml name: Sync to Other Repositorieson:push:branches:- main # 只在推送到 main 分支时触发jobs:sync:runs-on: ubuntu-lateststeps:# 步骤0:签出(下载)主仓库的程式码- name: Checkout Main Repouses: actions/checkout@v3with:fetch-depth: 0# 新增步骤:安装 git-filter-repo 工具- name: Install git-filter-reporun: pip3 install git-filter-repo# 步骤1:推送到你的第1个目标仓库,并排除工作流文件夹- name: Push to Target Repository 1run: |# 清理旧的临时目录,确保环境干净rm -rf ../repo-clone# 设置 SSH 环境mkdir -p ~/.sshecho "${{ secrets.XUHXJX }}" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hosts# 克隆当前仓库到一个临时目录git clone . ../repo-clonecd ../repo-clone# 使用 git-filter-repo 工具移除 .github/workflows 文件夹git-filter-repo --path .github/workflows --invert-paths --force# 重新添加一个名为 origin 的远程地址,指向目标仓库git remote add origin git@github.com:xuhxjx/SSS2.git# 以镜像模式推送处理后的代码到目标仓库git push --mirror origin# 步骤2:推送到你的第2个目标仓库,并排除工作流文件夹- name: Push to Target Repository 2if: success() # 仅在前一步成功时执行run: |# 清理旧的临时目录,确保环境干净rm -rf ../repo-clone# 设置 SSH 环境mkdir -p ~/.sshecho "${{ secrets.MSHXJX }}" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hosts# 克隆当前仓库到一个临时目录# 注意:这里我们从原始的检出目录重新克隆cd $GITHUB_WORKSPACEgit clone . ../repo-clonecd ../repo-clone# 移除 .github/workflows 文件夹git-filter-repo --path .github/workflows --invert-paths --force# 重新添加一个名为 origin 的远程地址,指向目标仓库git remote add origin git@github.com:msxhjx/SSS2.git# 以镜像模式推送处理后的代码到目标仓库git push --mirror origin- name: Push to Target Repository 3if: success() # 仅在前一步成功时执行run: |# 清理旧的临时目录,确保环境干净rm -rf ../repo-clone# 设置 SSH 环境mkdir -p ~/.sshecho "${{ secrets.HXJXHK }}" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hosts# 克隆当前仓库到一个临时目录# 注意:这里我们从原始的检出目录重新克隆cd $GITHUB_WORKSPACEgit clone . ../repo-clonecd ../repo-clone# 移除 .github/workflows 文件夹git-filter-repo --path .github/workflows --invert-paths --force# 重新添加一个名为 origin 的远程地址,指向目标仓库git remote add origin git@github.com:hxjxhk/SSS2.git# 以镜像模式推送处理后的代码到目标仓库git push --mirror origin- name: Push to Target Repository 4if: success() # 仅在前一步成功时执行run: |# 清理旧的临时目录,确保环境干净rm -rf ../repo-clone# 设置 SSH 环境mkdir -p ~/.sshecho "${{ secrets.HXJX2266 }}" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hosts# 克隆当前仓库到一个临时目录# 注意:这里我们从原始的检出目录重新克隆cd $GITHUB_WORKSPACEgit clone . ../repo-clonecd ../repo-clone# 移除 .github/workflows 文件夹git-filter-repo --path .github/workflows --invert-paths --force# 重新添加一个名为 origin 的远程地址,指向目标仓库git remote add origin git@github.com:hxjx2266/SSS2.git# 以镜像模式推送处理后的代码到目标仓库git push --mirror origin -
修改关键信息:根据你自己的用户名和仓库名,修改 YAML 文件中每一处的 git@github.com:YourUsername /repo-b.git 等 URL 地址。
-
保存文件,然后将这些新的文件提交并推送到你的主仓库 Repo-A。
第五步:测试与验证
推送完成后,进入你的主仓库 Repo-A 的 Actions 标签页,检查工作流是否成功运行。如果成功,你的代码应该已经被同步到所有配置的目标仓库中了,并且目标仓库里不会包含 .github/workflows 文件夹。