#!/usr/bin/env bash # 直改车道闸(git pre-commit,2026-10-26 车道铁律)——staged 不含代码面的提交,提交点现场跑 # 文档域闸(tools/run_all_gates.sh --docs,秒级文本扫描):绿=落地,红=中止。 # 代码面=game/ 下非 .md 的行为载体(判据与改动域划分同一)。staged 含代码面时: # 主工作区=拦(代码面唯一合法路径=worktree 批合回);任务 worktree=跳过(归批末闸+合回闸管, # 不打扰迭代批中间提交)。--no-verify 绕过仅属用户(agent 侧由 worktree-guard 拦截)。 set -u REPO="$(git rev-parse --show-toplevel)" # staged 路径集(首提交无 HEAD 时对 --root 比);空集放行,交回 git 自身报「无改动可提」 if git rev-parse --verify -q HEAD >/dev/null 2>&1; then STAGED="$(git diff --cached --name-only)" else STAGED="$(git diff --cached --name-only --root)" fi [ -z "$STAGED" ] && exit 0 # 代码面判定:staged 里任一路径落在 game/ 且非 .md if printf '%s\n' "$STAGED" | grep '^game/' | grep -viE '\.md$' | grep -q .; then # 主区判定:git-dir 与 common-dir 同一=主工作区(非链接 worktree) _GD="$(cd "$(git rev-parse --git-dir)" && pwd)" _CD="$(cd "$(git rev-parse --git-common-dir)" && pwd)" if [ "$_GD" = "$_CD" ]; then echo "[直改闸] 主工作区禁止直提代码面(game/ 下非 .md)——代码面改动走迭代批独立 worktree(git worktree add ../g-plan2-<任务名> -b <任务分支>),收尾在主工作区 git merge --no-ff 合回。" >&2 exit 1 fi exit 0 fi RC=0 bash "$REPO/tools/run_all_gates.sh" --docs || RC=$? if [ "$RC" -eq 0 ]; then exit 0 elif [ "$RC" -eq 1 ]; then echo "[直改闸] 文档域闸有新增红,提交已拦。修上方红项后重新 commit,钩子会自动重跑闸;禁跑代码域/游戏类测试,与本次红项无关。" >&2 else echo "[直改闸] 闸脚本自身故障(退出码 $RC),不是文档红——把本输出原样呈报用户,勿改文档、勿跑替代测试。" >&2 fi exit 1