From 54d641e1c5324e7a9b37593774e9c16dd6339195 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 05:38:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=88=91=20de1b072=20=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E7=9A=84=E6=B4=BB=E5=9B=9E=E5=BD=92=EF=BC=88pi=20017c?= =?UTF-8?q?0239=20=E6=8A=A5=E5=9B=9E=EF=BC=9A--git-hooks=20=E5=81=87?= =?UTF-8?q?=E7=BA=A2"=E6=89=BE=E4=B8=8D=E5=88=B0=20git"=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=9D=97=E5=86=85=E8=A1=A5=E5=9B=9E=20env-defaults=20=E2=91=A3?= =?UTF-8?q?=20=E7=9A=84=20PATH=20=E5=BD=92=E4=B8=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ 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 行(全在本块内) --- deploy/install.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/deploy/install.sh b/deploy/install.sh index 55e8fb8..040c1d5 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -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