两个 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 ⇒ 绿
94 lines
3.3 KiB
Plaintext
94 lines
3.3 KiB
Plaintext
# ---- 依赖与构建产物 ----
|
||
#
|
||
# 前端只在**构建期**用到 npm:`npm run build` 出的 dist/ 被 cp 进
|
||
# server/internal/static/static/ 再由 go:embed 编进二进制。
|
||
# 部署机上没有 node,产物就是「一个二进制 + 一个 .db 文件」。
|
||
# 因此这三样都不进版本库:装依赖与构建都能从 package-lock.json 复现。
|
||
client/electron/node_modules/
|
||
|
||
# 构建期的临时目录(electron-builder / fpm / hvigor 的 TMPDIR 落点,见 client/electron/BUILD.md)。
|
||
# 2026-09-14 教训:这里曾被一次 `git add -A` 把 554 个 node 编译缓存文件扫进版本库 ——
|
||
# 缓存进库既没意义又会掩盖真实的改动面,所以按目录整体忽略。
|
||
.tmp/
|
||
client/electron/dist/
|
||
plugins/*/node_modules/
|
||
|
||
# dsh-mail-bridge 是 TypeScript 写的,dist/ 是 tsc 的产物。
|
||
# 与 client/electron/dist 同一个理由:装依赖与构建都能从 package-lock.json 复现,
|
||
# 产物不进版本库。注意它**必须在装插件前构建**(package.json 的
|
||
# main 指向 dist/index.js),deploy/install.sh 负责这一步。
|
||
plugins/*/dist/
|
||
|
||
# go:embed 的输入目录 = client/electron/dist 的副本,同属构建产物。
|
||
#
|
||
# 但目录本身要留下:go:embed 要求它存在才能编译,否则新克隆连
|
||
# `go test ./...` 都跑不起来 —— 只改后端的人不该被迫先装 node。
|
||
# 因此忽略构建产物,只保留 placeholder.html(见该文件内注释:
|
||
# 之所以不叫 index.html,是因为那正是 Vite 产物的名字,会被反复覆盖)。
|
||
server/internal/static/static/*
|
||
!server/internal/static/static/placeholder.html
|
||
|
||
# Go 构建产物
|
||
server/agentmail-gateway
|
||
server/gw
|
||
*.test
|
||
|
||
# ---- 构建产物(不入库)----
|
||
#
|
||
# ★ 2026-09-28 新增 `*.hap`:鸿蒙构建产物**内嵌 `agconnect-services.json` 真身**
|
||
# (实测:client_id / 4 个 32 位 code / oauth_client —— 即 AGC api_key 信封)。
|
||
# 两个 36MB 的 hap 被 `f51c9c8`(一个标题为「workspace 谓词抽成共享构造器」的重构提交)
|
||
# 顺手带进了版本库。
|
||
#
|
||
# 为什么必须 ignore 而不是"记得别 add":`.githooks/pre-push` 原先只按**路径**拦
|
||
# AGC json,而 hap 是**二进制**里的凭证 —— 逐条路径列举追不上产物形态。
|
||
# `*.hap` 顺带堵住"下次构建又手滑 add 一次"。
|
||
*.hap
|
||
*.app
|
||
*.ipa
|
||
|
||
# ---- 运行态数据 ----
|
||
#
|
||
# SQLite 库与附件目录:生产在 /opt/agentmail/data,
|
||
# 本地调试可能落在仓库里,绝不能提交(含真实邮件与凭证哈希)。
|
||
*.db
|
||
*.db-shm
|
||
*.db-wal
|
||
data/
|
||
attachments/
|
||
|
||
# ---- 凭证 ----
|
||
#
|
||
# 管理员密码、Agent 密钥、opencode server password 都在 env 文件里。
|
||
.env
|
||
*.env
|
||
|
||
# ---- Agent 工具的运行态目录 ----
|
||
#
|
||
# 这些是 pi / omo 在仓库里落的会话与后台任务状态,属于本机运行痕迹,
|
||
# 不是项目的一部分。
|
||
.pi/
|
||
.omo/
|
||
.pi-glla/
|
||
.codegraph
|
||
|
||
# ---- Python 工具缓存 ----
|
||
#
|
||
# client/electron/src/icons/generate.py 是图标生成脚本(cairosvg + Pillow)。
|
||
# 静态检查器跑 ruff 时会在同目录落 .ruff_cache/,不是项目内容。
|
||
.ruff_cache/
|
||
__pycache__/
|
||
*.pyc
|
||
|
||
# ---- 编辑器与系统 ----
|
||
.DS_Store
|
||
*.swp
|
||
.idea/
|
||
.vscode/
|
||
plugins/homeagent-mail-bridge/build/
|
||
|
||
# 构建产物(曾误提交)
|
||
server/server
|
||
plugins/zcode-mail-bridge/test/manual/gate-e2e-evidence.json
|
||
.hvigor/
|