把本地项目发布到 GitHub 的完整流程——开源前体检、署名与凭据配置、建仓库、推送、验证、清理。
这是一份给 AI 助手用的工作流技能(Skill),也可以当 checklist 自己照着做。
发布一个项目到 GitHub,看起来就几条命令,实际一脚一个坑:
- 设备授权页面死活打不开(网关拦了)
- gh CLI 报权限不足
- SSH 密钥生成失败(路径格式问题)
- 推上去发现 commit 挂在错误的账号上
- 强推失败,而令牌已经删了
这些坑每一个都要折腾十几分钟。这个技能把它们全部固化下来,一次走通。
cp -r github-publish ~/.workbuddy/skills/然后对助手说一句:「把这个项目发布到 GitHub」,它会自动加载并按流程执行。
直接读 SKILL.md,照着做。每一步都有具体命令。
0. 发布前体检(扫硬编码路径与敏感信息)
1. 环境检查(git / gh / SSH / 署名)
2. 确定署名(推荐 noreply 隐私邮箱)
3. 认证(SSH 推荐 / gh CLI / API 令牌)
4. 建仓库(网页或 API,auto_init 必须 false)
5. 本地提交
6. 推送(改写历史需 force)
7. 验证(核对提交信息、作者、归属账号)
8. 清理凭据(确认成功后)
9. 加 topic 标签
- 密码和令牌不进对话——存文件、读文件、用完删
- 凭据在确认推送成功之后才清理——提前删,失败就得重来
- 私钥永不外传——只给公钥
- 公开推送不可逆——推之前必须体检敏感信息
| 坑 | 症状 | 解法 |
|---|---|---|
| 设备授权被拦 | Bad Gateway / unexpected EOF |
改 SSH 或 API |
| gh 权限不足 | missing required scope 'read:org' |
令牌加勾 read:org |
| SSH 路径格式 | No such file or directory |
用 C:/Users/... |
| force-with-lease | stale info |
git fetch + --force |
| 凭据删早了 | 推送失败却没了令牌 | 验证后再清理 |
| 记事本双后缀 | 找不到 token 文件 | 按 ghp_ 前缀搜 |
| Python urllib 抽风 | SSL: UNEXPECTED_EOF |
改用 curl |
| bash 里 timeout | 无效语法 |
别用 timeout 包命令 |
第一次发布之后本地项目还在改,之后要把改动同步到已存在的仓库:
- 先 diff 再合并,别整文件覆盖——开源副本常被改过(加了 README/LICENSE、路径泛化、顶部加了说明),
直接
cp会把这些开源化处理冲掉。 - 推完反向 diff 一次——脱敏改写往往做在开源副本上,源项目那份可能还是旧的 (结果就是:对外发布的是新规则,自己日常用的还是老规则)。规则性改动要回灌源项目。
验证分三层:
# 1. 工作树是否干净
git status --porcelain
# 2. 本地 HEAD vs 远端,逐文件 blob 哈希比对
git ls-tree -r HEAD
curl -s "https://api.github.com/repos/<owner>/<repo>/git/trees/<branch>?recursive=1"
# 只比对提交号会被「文件漏传」骗过,必须逐文件对 sha
# 3. 源项目 vs 开源副本,逐字节
diff -rq <开源副本> <源项目> # 差异应只剩开源化包装本身第三层若出现规则性差异(一边写"用 A"、另一边还是"用 B"),说明同步漏了,必须回灌。
GitHub 拿 commit 邮箱匹配账号,跟显示名无关。
邮箱绑在哪个账号,commit 就归谁。所以多人协作或用多账号时,想指定归属,就用那个账号的 noreply 邮箱:ID+登录名@users.noreply.github.com。
GitHub 为主,Gitee / GitLab 流程相同,仅域名和令牌页面不同。
MIT,见 LICENSE。