修我 de1b072 引入的活回归(pi 017c0239 报回:--git-hooks 假红"找不到 git"):块内补回 env-defaults ④ 的 PATH 归一化

★ pi 报的回归**实测成立**(我对**自己的**提交做严格 A/B,真 git worktree、工具齐全但 PATH 无 git):
     de1b072^(旧位置): rc=0  hooksPath=.githooks   ← source 的 ④ 已把 /usr/bin 补回
     de1b072 (新位置): rc=2  hooksPath=(未设)      ← ④ 还没跑 ⇒ 假红"找不到 git" **且真的没装上**
   触发带逐条复现(pi 报的三条全部命中):
     PATH=/usr/local/sbin 旧 rc=0 装上 / 新 rc=2 未装
     PATH=/opt/tools      旧 rc=0 装上 / 新 rc=2 未装
     PATH=/sbin:/usr/sbin 旧 rc=0 装上 / 新 rc=2 未装
     PATH=/usr/bin        旧 rc=0 / 新 rc=0(对照带,不触发)

★ 根因: 块前移到 source 之前 ⇒ 同时丢了**两条**保证,我只补了一条:
     ① AGENTMAIL_REQUIRE 的 git 预检(缺 git ⇒ exit 2)—— 我上轮补了
     ② ★ env-defaults ④ 的 **PATH 归一化** —— **漏了**(env-defaults.sh:124-130)
   ⇒ ★ 两条的失败方向相反: ① 缺了是**漏**(少一条检查)、② 缺了是**误**(凭空假红)
   ⇒ 这正是"搬动代码要重算它原来免费得到的保证"的第二次触发,而**我算漏了第二条**

★ 修法: 块内按 env-defaults ④ **逐字相同**的规则补回 PATH(幂等),位置在 command -v git 之前
   实测: 三条触发带全部 rc=0 且 hooksPath=.githooks ✓;连跑两次幂等 ✓
   负控制: command -v git 真失败时仍 exit 2 + 人话 ✓(原行为保留)
   未改 help/DEFER 语义(未插到文件顶部,故 --help 的 sed 2,20 行号不受影响)

★ 另报一处**既存**(非我引入,两版都如此,故不在本修范围):
   PATH **完全为空** ⇒ line 11 的 `dirname` 先崩(旧 rc=1 / 新 rc=128)⇒ 到不了本块
   ⇒ 已记为待判项,未在本次动(改它要动 REPO 计算那行,属另一件事)

★ 验证: bash -n OK;mode=755;diff 仅 +11 行(全在本块内)
This commit is contained in:
2026-09-25 05:38:49 +08:00
parent 5ca0cd6b27
commit 54d641e1c5

View File

@ -79,6 +79,17 @@ if [[ $GIT_HOOKS -eq 1 ]]; then
# 所以这里**自己**判一次 `git` 在不在。否则缺 git 时得到的是 bash 的
# `git: command not found`(退出码 127)—— 而本仓约定"环境问题=2、且要给人话"。
# (这是我把本块前移时实测撞出来的:127 不在本仓的退出码词汇表里。)
#
# ⚠️⚠️ 但只补 ① 不够 —— 前移同时**丢掉了第二条**保证(pi 2026-09-25 实测报回:活回归):
# **env-defaults ④ 的 PATH 归一化**(PATH 可能不含 /usr/bin)。
# 只补 ① 会得到**假红**:git 明明装在 /usr/bin,却因 PATH 里没有它而报"找不到 git",
# 且**真的没装上**(旧位置 rc=0 装上 / 前移后 rc=2 未装)。
# ★ 这一条比 ① 更隐蔽:① 缺了是**漏**(少一条检查)② 缺了是**误**(凭空假红)。
# 规则与 env-defaults.sh:124-130 的 ④ 逐字相同(且同样幂等)。
case ":${PATH:-}:" in
*:/usr/bin:*) : ;;
*) PATH="${PATH:+$PATH:}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; export PATH ;;
esac
if ! command -v git >/dev/null 2>&1; then
echo " [FAIL] 环境不足:找不到 git(--git-hooks 只用 git,但它不在 PATH 里)" >&2
echo " 药方:装 git,或把它的目录加进 PATH 后重跑。" >&2