github-fork-sync-assistant
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) - 结果已按格式汇报(成功/失败/跳过三类)
参考链接
More from cruldra/skills
tauri-v2
Tauri v2 项目开发助手 - 提供 CLI 项目管理、最佳实践指导和代码生成。适用于 (1) 创建和管理 Tauri v2 项目 (2) 开发桌面和移动应用 (3) 配置构建和分发流程 (4) 实现安全的前后端通信 (5) 应用架构设计和性能优化。
15pandoc
当用户需要对某个文档进行格式转换时(例如将 Markdown 转换为 DOCX、PDF、HTML 等)使用该技能。
12refine-dev
协助开发基于 Refine 框架的 React 应用。提供项目初始化、核心配置、数据提供者(Data Providers)、认证(Auth Provider)以及 UI 库集成的指导。专注于使用 shadcn/ui 构建现代化的后台管理系统。
11dri-text-analysis
使用 DRI 文本分析法(Data-Rule-Interaction)对自然语言需求描述进行逐词拆解与领域建模。将非结构化的业务需求文本降维为数据(D)、规则(R)、交互(I)三个维度的结构化架构抽象,直接产出可用于系统设计的概念表格。适用于需求分析、领域语言提取、架构设计前的文本解析,以及将长篇需求文档转化为清晰的开发任务拆解。
9vite-starter
使用 Vite 创建现代前端项目,支持 React、Vue、Svelte、Solid、Preact、Lit、Qwik 和 Vanilla JS,可选 TypeScript。当用户需要初始化新的前端项目、搭建 SPA、创建组件库、设置现代构建工具时使用此技能。触发场景:用户说"创建 vite 项目"、"新建 react/vue/svelte 应用"、"初始化前端项目"、"搭建 spa"、"用 vite 起一个项目"、"create vite project"、"new frontend app",或明确提及 Vite、HMR、快速构建工具时。
7plantuml-renderer
Use when the user wants to render PlantUML diagrams from pasted text or files that contain valid PlantUML blocks (such as .puml, .md, or .docx text content), and expects image/text output like svg, png, txt, or utxt via local Java + plantuml.jar.
7