github-fork-sync-assistant
SKILL.md
GitHub Fork 批量同步助手
批量将用户 GitHub 账号下所有 fork 仓库与上游(upstream)保持同步,等同于在 GitHub 界面上对每个 fork 点击 "Sync fork → Update branch"。
使用场景
当用户提出以下请求时触发此技能:
- "同步我所有的 fork 仓库"
- "帮我更新所有 fork"
- "把我 fork 的项目都和上游同步一下"
- "sync all my forks"
- 任何涉及批量同步 fork 仓库的请求
前提条件
在开始同步前,必须按顺序验证以下条件:
-
GitHub CLI (
gh) 已安装gh --version如果未安装,提示用户参考 https://cli.github.com/ 安装。
-
已登录 GitHub
gh auth status如果未登录,引导用户执行:
gh auth login或者,如果用户提供了 GitHub Personal Access Token (PAT):
echo "<TOKEN>" | gh auth login --with-token -
Token 权限
- 需要
repo权限(对私有仓库)或public_repo权限(仅公开仓库) - 如果使用 Fine-grained PAT,需要
Contents: Write权限
- 需要
标准工作流
第 1 步:验证环境
执行前提条件中的检查。如果用户首次使用此技能需要提供 token,记录下来避免后续重复询问。
第 2 步:获取所有 fork 仓库列表
使用 gh repo list 列出当前用户所有 fork 仓库:
gh repo list --fork --json nameWithOwner,defaultBranchRef --limit 1000 --no-archived
返回格式示例:
[
{
"defaultBranchRef": { "name": "main" },
"nameWithOwner": "myuser/some-project"
},
{
"defaultBranchRef": { "name": "master" },
"nameWithOwner": "myuser/another-project"
}
]
如果用户 fork 数量超过 1000,需要分页获取(调大 --limit 或多次请求)。
向用户展示 fork 仓库列表及数量,确认是否继续同步全部,或让用户选择性排除某些仓库。
第 3 步:逐个同步 fork 仓库
对每个 fork 仓库,执行同步命令:
gh repo sync <nameWithOwner>
例如:
gh repo sync myuser/some-project
此命令会:
- 自动识别上游(parent)仓库
- 将 fork 的默认分支与上游默认分支同步
- 执行 fast-forward 合并
同步指定分支(如果需要):
gh repo sync <nameWithOwner> --branch <branch-name>
第 4 步:处理同步失败
同步可能因以下原因失败:
| 失败原因 | gh repo sync 表现 |
处理方式 |
|---|---|---|
| 合并冲突 | 返回非零退出码,提示 conflict | 跳过,记录到失败列表 |
| 仓库已归档 | 返回错误 | 跳过(已在第 2 步通过 --no-archived 过滤) |
| 权限不足 | 返回 403/权限错误 | 跳过,记录到失败列表 |
| 上游仓库已删除 | 返回错误 | 跳过,记录到失败列表 |
| 已是最新 | 正常返回,提示 already up to date | 记录到成功列表 |
关键规则:遇到无法自动合并的仓库,不要使用 --force(会丢失用户在 fork 上的自定义提交),除非用户明确要求强制同步。
第 5 步:汇报结果
同步完成后,按以下格式向用户汇报:
## Fork 同步结果
**同步时间**: 2024-01-15 14:30:00
**总计**: 25 个 fork 仓库
### ✅ 成功同步 (20)
| 仓库 | 默认分支 | 状态 |
|------|---------|------|
| myuser/project-a | main | 已更新 |
| myuser/project-b | master | 已是最新 |
| ... | ... | ... |
### ❌ 同步失败 (3)
| 仓库 | 默认分支 | 失败原因 |
|------|---------|---------|
| myuser/project-x | main | 存在合并冲突 |
| myuser/project-y | develop | 上游仓库已删除 |
| myuser/project-z | main | 权限不足 |
### ⏭️ 已跳过 (2)
| 仓库 | 原因 |
|------|------|
| myuser/old-project | 用户要求排除 |
| myuser/archived-project | 已归档 |
备选方案:使用 GitHub REST API
如果 gh repo sync 不可用或需要更细粒度的控制,可使用 GitHub REST API:
列出 fork 仓库
gh api user/repos --paginate --jq '.[] | select(.fork == true) | .full_name'
同步单个 fork
gh api repos/<owner>/<repo>/merge-upstream -f branch=<default-branch>
响应状态码:
200 OK— 同步成功(fast-forward 或 merge commit)409 Conflict— 存在合并冲突,无法自动同步422 Unprocessable Entity— 分支不存在或其他错误
检查 fork 是否落后于上游
gh api repos/<owner>/<repo>/compare/<default-branch>...<upstream-owner>:<default-branch> --jq '.status'
返回值:identical(一致)、behind(落后)、ahead(领先)、diverged(分叉)。
命令模板
完整同步脚本(供参考)
以下是 Agent 执行同步时的核心逻辑(伪代码):
1. 验证 gh auth status
2. forks = gh repo list --fork --json nameWithOwner,defaultBranchRef --limit 1000 --no-archived
3. 展示列表,确认用户是否继续
4. 对每个 fork:
a. 执行 gh repo sync <nameWithOwner>
b. 根据退出码分类:成功 / 失败 / 已是最新
5. 汇总输出结果表格
关键规则
- 绝不使用
--force:除非用户明确要求,否则不要使用gh repo sync --force,它会通过 hard reset 丢弃用户在 fork 上的所有自定义更改。 - Token 复用:首次获取用户的 GitHub 认证后记录下来,同一会话中不再重复询问。
- 并发控制:逐个同步(串行),避免触发 GitHub API 速率限制(认证用户 5000 次/小时)。如果 fork 数量非常大(>100),考虑在每 30 个请求后暂停几秒。
- 只同步默认分支:除非用户明确指定,否则只同步 fork 的默认分支。
- 不修改本地仓库:此技能只操作 GitHub 远程仓库,不克隆或修改本地文件系统。
快速检查清单
-
gh --version成功 -
gh auth status显示已登录 - 已获取 fork 仓库列表
- 已向用户确认同步范围
- 逐个执行同步
- 失败仓库已记录并跳过(未使用
--force) - 结果已按格式汇报(成功/失败/跳过三类)
参考链接
Weekly Installs
2
Repository
cruldra/skillsFirst Seen
12 days ago
Security Audits
Installed on
cline2
github-copilot2
codex2
kimi-cli2
gemini-cli2
cursor2