Files
MailUI4Agents/.githooks
JianFeeeee cbfc3bdde7 fix(安全): 构建产物出库 + pre-push 加**按内容**的第二道闸
两个 36MB 的 .hap 被 f51c9c8(一个标题为「workspace 谓词抽成共享构造器」的
重构提交)顺手带进版本库,而它们**内嵌 AGC 配置真身**。

## 实测确认(不是推测)

用 python zipfile 打开两个 hap,逐字段核对形状(不打印值):
  resources/rawfile/agconnect-services.json
    client.client_id         HEX len=19
    code.code1..code4        HEX len=32  ×4   ← api_key 信封
    oauth_client.client_id   HEX len=19
    app_info.app_id          HEX len=19

`git merge-base --is-ancestor f51c9c8 origin-https/main` 判否
⇒ **仅本地、尚未推送**(本仓镜像是 public / 匿名可 clone)。

## 为什么只 rm --cached 不够

`git rm --cached` 只把文件移出 index,**blob 仍躺在未推送的提交里** ——
下一次 `git push` 会连它一起发出去。所以必须同时堵"下一次"。

## 改法

① .gitignore 加 `*.hap` / `*.app` / `*.ipa`
② .githooks/pre-push 加第二道闸:**按内容**查,不按路径
   —— 原先只按路径拦 agconnect-services.json,而 hap 里它只是
      一个 zip 条目,逐条列举路径追不上产物形态。

判据形态:本次推送范围内**新增或修改**的构建产物(`*.hap/*.app/*.ipa`)
          → 内容里出现 `agconnect-services.json` 这个**条目名** ⇒ 拦。
用条目名而非凭证值:值会变而条目名稳定,且搜值需把凭证读进内存。

## ★ 这一格踩了三个坑,每个都让闸**静默放行**(都实测过)

① `git diff "a..b"` 取不到"该范围新增的文件" —— 它的语义是
   「工作区 vs b」,**干净工作区上恒为空**。第一版这么写,
   实测含真凭证的 hap 被放行、push exit=0。
   ⇒ 改 `git log --diff-filter=AM --name-only`(天生吃范围)。
② `git rev-parse "a..b:path"` 输出**两行**(blob sha + `^a`),
   赋进变量是多行值 ⇒ 后续 `cat-file` 失败 ⇒ 被 `|| blob_sha=""`
   兼掉 ⇒ 静默跳过。
   `git ls-tree "a..b"` 也报错(不接受范围)。
   ⇒ 正确形状:rev-list 取 tip → ls-tree <tip> 取 blob。
③ ★★ `grep -q` 接管道 + `set -o pipefail`:grep 命中即退出 ⇒ 上游
   `git cat-file` 收 SIGPIPE 退 **141** ⇒ pipefail 取各段合取 ⇒
   整条管道 141 ⇒ `if` 判假。**"找到凭证"被读成"没找到"。**
   实测 PIPESTATUS=141 0。
   失效方向恰好是**放行**,与本钩子"宁可推不出去"相反。
   ⇒ 去掉 `-q`,让 grep 读完整条流(最后一段自然是它的码)。

## 验证(四态,都实测过)

  含真凭证的 hap   ⇒ 拦,裸仓没收到 commit
  干净的 hap        ⇒ 放行(只有 example.json)
  AGC json 路径     ⇒ 仍拦(第一道没坏)
  删分支            ⇒ 不误拦
  commit-hygiene    ⇒ 绿
2026-09-28 08:26:15 +08:00
..