@lx-frontend/lixin-commit-prettier-split
v0.0.2
Published
自动拆分 commit 中的格式化与业务逻辑改动
Readme
@lx-frontend/lixin-commit-prettier-split
用于拆分「格式化改动」与「业务逻辑改动」的工具包,包含:
lx-commit-split:重组最近一次提交,拆成 style + 业务两条提交pre-push-commit-split.sh:在 push 前检测并提示是否自动拆分
安装
npm i -D @lx-frontend/lixin-commit-prettier-split命令
手动拆分最近一次提交
lx-commit-splitpre-push hook 使用
ln -sf ./node_modules/@lx-frontend/lixin-commit-prettier-split/pre-push-commit-split.sh .git/hooks/pre-push
chmod +x .git/hooks/pre-pushpre-push-commit-split 流程图(文本版)
初始化与上下文定位
- 切到仓库根目录
cd "$(git rev-parse --show-toplevel)" || exit 1
- 清理 Git 前缀环境
unset GIT_PREFIX
- 定义常量与状态文件
- 全零 SHA:
z40="0000000000000000000000000000000000000000" - 一次性跳过文件:
split_skip_file="$(git rev-parse --git-dir)/.pre-push-commit-split-skip-once"
- 全零 SHA:
- 获取当前 HEAD
current_head="$(git rev-parse HEAD 2>/dev/null || echo "")"
- 切到仓库根目录
skip-once 快速放行
- 如果存在
split_skip_file- 读取其中的
skip_sha - 删除该文件(一次性)
- 若
skip_sha == current_head- 直接
exit 0 - 作用是避免“刚自动拆分后再次 push”被重复拦截
- 直接
- 读取其中的
- 如果存在
单组 ref 处理函数
handle_ref_pair- 入参
local_ref local_sha remote_ref remote_sha
- 删除分支场景放行
if [ "$local_sha" = "$z40" ]; then return 0; fi
- 获取本次用于检测的文件(仅 M)
MODIFIED_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD --diff-filter=M | grep -E "\.(js|ts|vue|jsx|tsx)$" || true)
- 触发条件判断
if [ -n "$MODIFIED_FILES" ] && npx prettier --check $MODIFIED_FILES > /dev/null 2>&1; then- 含义:存在修改文件且这些文件已满足 prettier 结果 -> 认为应拆分 style/logic
- 命中后进入交互
- 打印告警:检测到已完成 prettier,建议拆分
exec < /dev/ttyread -p "是否运行 lx-commit-split 自动优化提交历史?[y/N] " yn
- 用户选择分支
- 选择
y/Y- 执行
npm run commit:split - 若成功
- 记录新
HEAD到split_skip_file - 提示“历史已重构,请重新 push”
exit 1(中断本次 push,要求用户再 push 一次)
- 记录新
- 若失败
exit 1
- 执行
- 其他输入(默认 N)
- 不做拆分,继续后续流程(最终
exit 0)
- 不做拆分,继续后续流程(最终
- 选择
- 入参
pre-push / 非 pre-push 两种入口
- 若参数不足(
$# -lt 2)- 构造兜底 ref(手动执行场景,避免阻塞)
- 调一次
handle_ref_pair
- 否则(真实 pre-push)
- 循环读取 stdin 每行 ref 对
- 每组调用
handle_ref_pair
- 若参数不足(
脚本结束
exit 0
测试命令
npm test
npm run test:shell
npm run test:shell:coverage