git workflow 规则描述的是人和 agent 该怎么操作,不是仓库本身该怎么配置。这个断层会在项目初期很快暴露:前几周里堆积的过期分支、参差不齐的合并历史、每个人都以为别人会写的清理脚本。

这份清单覆盖的是一次性的、仓库层面的初始化,让 git workflow 真正能跑起来。

#为什么这是一个独立关注点

规则说"PR 合并后删除本地分支"。没有正确设置的仓库会和规则对着干:

这些问题每一个都能一步解决,但必须有人记得去做。清单的价值就是把"记得去做"显式化。

#托管平台设置

在第一个 PR 合并之前配置:

适配说明: GitHub 的位置在 Settings → BranchesSettings → General → Pull Requests。GitLab 在 Settings → Repository → Protected branchesSettings → General → Merge requests。Bitbucket、Gerrit、自建 Forgejo 都有对应界面——名字不同,设置相同。

#本地清理脚本

squash 合并会把整个 PR 压成一个新的 commit 并落到默认分支上,原分支上的 commit 不再是这个新 commit 的祖先,所以 git branch -d <name> 会把分支视为"未合并"而拒绝删除。因此 squash 感知的清理脚本不是可选项,而是必需品。

加一条清理命令,做到:

  1. 清理上游已消失的远程追踪分支。
  2. 删除 upstream 标记为 [gone] 的本地分支,不管 commit ancestry 怎么说。
  3. 没有可删除分支时干净退出。

示例(使用 npm 的 Node 项目):

"scripts": {
  "clean-branches": "git fetch -p && git for-each-ref refs/heads --format '%(refname:short) %(upstream:track)' | awk '$2 == \"[gone]\" {print $1}' | xargs git branch -D"
}

任何能跑 shell 的项目都能套同样的逻辑——一个 Makefile target、一个 shell function、或者项目里任何 task runner 的任务。

适配说明: Node → npm run clean-branches / pnpm run clean-branches。Python → tox / nox / just 任务或 Makefile target。Go → make target。清理逻辑一致,只有 runner 不同。

#Agent 指令入口

只要 agent 不知道命令存在,清理命令就是摆设。把入口写进项目的 agent 指令文件(AGENTS.mdCLAUDE.md.cursorrules)的 pre-work checklist 里:

一条 agent 从来不会读的规则等同于不存在。agent 指令里的 pre-work checklist 就是把规则真正接入工作流的机制。

#验证

一次性设置完成后验证:

任何一项回答"否"就代表设置没做完,无论仓库写了多少行规则文档。

#何时运行这份清单

"分支一直堆积"的反馈几乎总是能追到这份清单里漏掉的步骤,而不是贡献者不自律。