-
先确定改动范围——拿到后设好下面 bash 全程要用的 DIFF_RANGE / LOG_RANGE 两个变量:
-
收集改动(范围一律用步骤 1 设好的 $DIFF_RANGE / $LOG_RANGE):
diff 模式(默认)——读完整 diff 作为归纳依据:
git log $LOG_RANGE --pretty=format:"%h %s"
git diff --stat $DIFF_RANGE
git diff $DIFF_RANGE
commit 模式(用户显式要求时)——不读完整 diff,改读 commit subject + 完整 body:
git log $LOG_RANGE --pretty=format:"%h %s%n%b%n----"
git diff --stat $DIFF_RANGE
- commit 模式下,「改动概述」按 commit message 归纳;若某些 commit message 太单薄、说不清做了什么,可针对那几个文件补看局部 diff,但不必读整个大 diff。
-
专项扫描「显眼区块」的来源(无论改动多大、无论哪种模式 / 哪种范围,这一步都不能跳):
git diff --name-status $DIFF_RANGE -- '.env*' '**/.env*'
git diff $DIFF_RANGE -- '.env*' '**/.env*' '*.ts' '*.js' | grep -nE '^\+.*process\.env\.[A-Z_][A-Z0-9_]*'
git diff --name-status $DIFF_RANGE -- '*.sql' '**/migrations/**'
git diff $DIFF_RANGE -- 'web/src/router/**' '**/web/src/router/**' | grep -nE "^\+.*\bpath:\s*['\"]"
.env 若被 gitignore 没进 git,则以 .env.example 或代码中新增的 process.env.XXX 为准。
- 提取每个新增/变更环境变量的变量名、用途、必填还是可选、默认值(看 diff 上下文推断)。
- 提取数据库变更的表 / 列 / 索引改动和迁移脚本路径,能判断就标注在哪个库执行。
- web 新增路由:只扫
web/(Vue 管理端)的路由文件,抓新增的 path: 条目。有新增路由 → IAM 那边需为这些路由配置权限,必须在部署须知单列一条(放「环境变量」之后);一条都没扫到就整条不显示。
-
生成内容(diff 模式基于 diff 归纳、commit 模式基于 commit message 归纳;都不逐行复述 diff、不逐条复述 commit):
- PR 标题:英文,遵循 conventional commit 风格(如
feat(scope): ...),概括整批改动的主题。
- PR 正文:套用下方模板。先放「⚠️ 部署须知」(仅当扫到 env / IAM 路由 / SQL 之一时保留;顺序:环境变量 → IAM 路由 → 数据库),再放按模块/功能归纳的「改动概述」。
- diff 模式:末尾可附
## Commits 短列表供追溯(用 git log $LOG_RANGE --pretty=format:"%h %s" 的结果)。
- commit 模式:省掉
## Commits 这一节——正文本就是按 commit message 归纳的,再列一遍纯属重复。
-
复制到剪贴板:用 here-doc 把完整 PR 内容管道给下面的跨平台复制函数,不要落盘任何文件:
pr_copy() {
if command -v pbcopy >/dev/null 2>&1; then pbcopy
elif command -v wl-copy >/dev/null 2>&1; then wl-copy
elif command -v xclip >/dev/null 2>&1; then xclip -selection clipboard
elif command -v xsel >/dev/null 2>&1; then xsel --clipboard --input
elif command -v clip.exe >/dev/null 2>&1; then clip.exe
elif command -v clip >/dev/null 2>&1; then clip
else cat; echo "[no clipboard tool found — printed above]" >&2; fi
}
pr_copy <<'PR_EOF'
<完整 PR 内容>
PR_EOF
若所有剪贴板命令都不存在,函数会回退为打印内容(用户仍能从对话预览里复制)。
-
完成后向用户简单汇报:PR 标题 + 「已复制到剪贴板」,并在对话里贴出完整内容供预览。