关于 stack-push
stack-push 是用于 Git 分支栈的技能,供开发者按顺序推送切片分支,并为每个切片创建或更新 PR。它将每个 PR 的基准设为父分支,并在栈根 PR 发布完整分支链摘要。
主要功能
- 01按栈顺序列出并推送分支
- 02确认每个分支含有提交
- 03为每个切片创建或更新 PR
- 04将 PR 基准设为父分支
- 05在根 PR 发布栈摘要表
适用场景
- 01stack-create 初始化且各切片已有提交后发布分支栈
- 02向切片添加提交后更新对应 PR
- 03按父子关系为分支栈创建草稿 PR
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ athola/ claude-night-market --skill stack-push安装后在 Claude Code 中输入/stack-push确认已加载。
详细介绍
原文在翻译后有更新,译文可能不是最新。
Stack Push
推送堆栈中的所有分支,并为每个切片打开(或更新)一个 PR,
每个 PR 均以其父分支为目标分支。
适用场景
在 stack-create 初始化分支拓扑且每个切片分支上至少有
一个提交后,运行 stack-push。
向任一切片添加提交后,也要运行此命令以更新
已打开的 PR。
不适用场景
- 尚无堆栈(使用
sanctum:stack-create) - 基分支已合并,堆栈需要跟进(使用
sanctum:stack-rebase)
前置条件
- 已完成
stack-create:分支已创建且包含提交 ghCLI 已通过身份验证(gh auth status)- 每个切片分支相较其基分支至少有一个提交
必需的进度跟踪
开始前创建 TodoWrite 项:
stack-push:branches-listedstack-push:branches-pushedstack-push:prs-openedstack-push:stack-summary-posted
步骤 1:列出堆栈分支(branches-listed)
识别堆栈中的所有分支。
按照惯例,这些分支共用 stack/<feature-name>/ 前缀:
STACK=stack/my-feature
BASE=master
git branch --list "${STACK}/*" | sed 's/^[* ]*//'
确认每个分支都有超出基分支的提交:
for branch in $(git branch --list "${STACK}/*" \
| sed 's/^[* ]*//'); do
count=$(git rev-list --count \
"$(git merge-base ${BASE} ${branch})..${branch}")
echo "${branch}: ${count} commit(s)"
done
任何显示 0 commits 的分支都必须先添加工作内容,才能
推送。
步骤 2:推送分支(branches-pushed)
按堆栈顺序将每个切片分支推送到远程服务
(先推送基切片):
for branch in $(git branch --list "${STACK}/*" \
| sed 's/^[* ]*//' | sort); do
git push --set-upstream origin "${branch}"
echo "pushed: ${branch}"
done
jj 加速方式(如可用)
jj git push --all
步骤 3:打开或更新 PR(prs-opened)
为每个切片创建一个 PR,并以其父分支为目标分支。
第一个切片的父分支是 master;后续切片的父分支是前一个
切片的分支。
PREV_BASE=master
for branch in $(git branch --list "${STACK}/*" \
| sed 's/^[* ]*//' | sort); do
# Check if a PR already exists for this branch
existing=$(gh pr list \
--head "${branch}" \
--json number \
--jq '.[0].number' 2>/dev/null)
if [ -n "${existing}" ]; then
echo "PR #${existing} already open for ${branch} -- skipping"
else
gh pr create \
--base "${PREV_BASE}" \
--head "${branch}" \
--title "[$(echo ${branch} | sed 's|.*/||')] <title>" \
--body "Part of stack \`${STACK}\`." \
--draft
echo "opened PR for ${branch} (base: ${PREV_BASE})"
fi
PREV_BASE="${branch}"
done
移除 --draft 标志前,填写实际的 PR 标题和正文。
对每个切片运行 Skill(sanctum:pr-prep),以生成
通过质量门槛的描述。
步骤 4:发布堆栈摘要(stack-summary-posted)
所有 PR 打开后,在第一个 PR(堆栈的根节点)上发布一条
摘要评论,列出完整链路:
ROOT_PR=$(gh pr list \
--head "${STACK}/$(git branch --list \
"${STACK}/*" | sed 's/^[* ]*//' | sort | head -1 \
| sed 's|.*/||')" \
--json number --jq '.[0].number')
# Build the stack table
BODY="## Stack\n\n| # | Branch | PR |\n|---|--------|----|\n"
N=1
for branch in $(git branch --list "${STACK}/*" \
| sed 's/^[* ]*//' | sort); do
pr_num=$(gh pr list --head "${branch}" \
--json number --jq '.[0].number')
BODY="${BODY}| ${N} | \`${branch}\` | #${pr_num} |\n"
N=$((N+1))
done
gh pr comment "${ROOT_PR}" --body "$(printf "${BODY}")"
说明
- 始终按堆栈顺序推送,以便 GitHub 在打开子 PR 前看到父
分支 - 默认使用
--draft;各切片通过审查后,再分别将其标记为
可供审查 - 每次运行
git rebase --update-refs后,都要使用
git push --force-with-lease重新推送(绝不使用--force) - 基 PR 合并后,运行
Skill(sanctum:stack-rebase),
先级联变基,再更新下一个 PR 的目标分支
完成标准
- 所有 4 个
TodoWrite项(从stack-push:branches-listed到
stack-push:stack-summary-posted)都在开始推送前创建,
并按顺序标记为已完成 - 调用
git push前,已确认每个切片分支相较其基分支至少有 1 个提交;
有 0 个提交的分支不得推送 - 每个切片均打开一个草稿 PR,且以其父分支为目标分支
(根切片以master/main为目标分支) - 根 PR 收到一条
## Stack评论,其中包含一个表格,列为
#、Branch和PR,并列出所有切片 - 此步骤完成后,
gh pr list --head <branch>对每个已推送分支
都会返回一个 PR 编号
评论
支持 Markdown