跳转到内容

cnb-rs pr merge ​

cnb-rs pr merge <NUMBER> [flags]

合并指定的 Pull Request。

选项 ​

  • <NUMBER>:PR 编号(必填)
  • -t, --commit-title <TITLE>:合并提交标题(必填)
  • -m, --commit-message <MESSAGE>:合并提交信息(默认:空)
  • -M, --merge-style <STYLE>:合并方式(默认 merge);使用 ValueEnum 在 clap 层校验取值
    • merge:创建合并 commit,保留全部 head 分支历史
    • squash:把 head 分支压成单个 commit 合入 base
    • rebase:把 head 分支逐 commit rebase 到 base 顶部
  • --force:强制合并并绕过分支保护;仅仓库 owner / admin 可用。这是 CNB 特有选项,参考的 gh pr merge 无此项

注:短选项是 -M(大写)不是 -s。后者被 pr list --state 占用,为避免跨命令语义冲突统一用 -M。

继承的全局选项:

  • --repo <REPO>:指定仓库路径(格式:group/repo)
  • --domain <DOMAIN>:指定目标域名(默认:cnb.cool)

输出约定 ​

  • stderr:人类可读的成功提示 ✓ 已合并 PR #42(squash, sha=a1b2c3d)。使用 --force 时显示 ✓ 已合并 PR #42(squash, 强制合并, sha=a1b2c3d);sha 取前 7 位是 git 社区惯例,足以唯一识别 commit
  • stdout:脚本可消费的完整 PR URL,与 pr create / pr close / pr comment add 保持一致
  • 失败:合并不成功(冲突 / CI 未过 / PR 已闭 / 不允许 push)时以 anyhow::bail! 非零退出,错误信息走 stderr。之前版本会 println! 并 exit 0 误导脚本

示例 ​

bash
# 默认 merge 方式
$ cnb-rs pr merge 42 -t "Merge PR #42"
✓ 已合并 PR #42(merge, sha=a1b2c3d)
https://cnb.cool/org/repo/-/pulls/42

# squash 合并
$ cnb-rs pr merge 42 -t "feat: 新功能" -M squash

# rebase 合并,附带提交信息
$ cnb-rs pr merge 42 -t "fix: 修复问题" -m "详细说明" -M rebase

# 强制合并(仅仓库 owner / admin 可用,会绕过分支保护)
$ cnb-rs pr merge 42 -t "feat: 新功能" --force

# 合并失败(PR 已 closed / 冲突 / CI 未过)
$ cnb-rs pr merge 271 -t "试试"
错误: 合并失败:合并请求已经合入目标分支
$ echo $?
1

# 非法 merge-style 被 clap 拒绝(exit 2)
$ cnb-rs pr merge 42 -t "x" -M invalid
error: invalid value 'invalid' for '--merge-style <MERGE_STYLE>'
  [possible values: merge, squash, rebase]

API 调用 ​

步骤API方法说明
合并 PR${API}/repos/{repo}/-/pulls/{n}/mergePUT请求体的 force=true 表示强制合并;返回 MergePullResponse { merged, message, sha }

另请参阅 ​

Released under the MIT License.