一個 repo 只有一個資料夾:分身住 repo 裡面的 .worktrees/,收工由同一支閘收掉(inkstone/ISEP#147)
leo 2026-09-07:「一個 repo 只看得到一個資料夾」「禁止這樣產出一大堆資料夾」。 根因:line-needs-own-worktree.sh 教工人開在 repo 旁邊,「收工 remove」只寫在閘訊息裡、沒機制驗, 每條線留一份 ⇒ tech_projects/ 長出 ISEP-wt-117/InkStoneCo-wt-112…一排。規則在文字裡不在機器上。 - scripts/worktree(新):open/close/list/sweep 四個動詞。分身住 <repo>/.worktrees/<票 repo>-<N> (走 .git/info/exclude,不動被追蹤的檔);「推了沒」只有這一份判準(三態:有/沒有/問不到, 問不到不當成沒推也不收);sweep 預設只列不動,--apply 只收「推了且乾淨」,--skip 是操作者點名。 - hooks/line-needs-own-worktree.sh:擋下時印 `scripts/worktree open`(絕對路徑,貼了就跑); 同一支多掛 PostToolUse Agent|Task——從【工單】認出分身,推了收、沒推點名分支+路徑(exit 2), 不 force、不刪。+0 支、+1 條(61 支/86 條,當場數的)。 - docs/governance/worktree-placement.md(新)+ principles 一行:禁令與閘互指。 - 測試:line-needs-own-worktree.test.sh 77→110(G 群:閘印的 open 那行原樣跑、旁邊不多任何東西; H 群:PostToolUse 推了收/沒推點名/安靜的方向);scripts/test-worktree.sh 42 條(七個分身的 fixture, 名字照 leo 看到的那排)。舊閘跑新測試 90/110,紅的 20 條正是這次改到的行為。 - permissions-allow.json 加 worktree 四種形狀(出路在雲端被分類器擋就走不通)。 - README/plugin.json/hooks-inventory 的數字在這棵樹上實數:61 支、86 條、62 支腳本。 待總管定版(改了會被載入的東西)。沒碰 hooks/lib/mainline.py。 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
This commit is contained in:
@@ -411,3 +411,33 @@ leo 當場:「**這些為什麼不寫到票裡?**」
|
||||
|
||||
📌 沒在本票修的同形狀:`not-my-branch-guard.sh` 的 `NOT_MY_BRANCH_OK=1 git commit …` 同樣只讀環境變數
|
||||
(第 28 行),沒實測、沒動——它認的動作是 commit,不是 push_target_dir 那條線的事,另報。
|
||||
|
||||
## ⚠️ MISTAKE: 閘教了「開」,「收」只寫在訊息裡——每條線留一份,leo 在 Finder 看到一排分身
|
||||
|
||||
票: `inkstone/ISEP#147`
|
||||
日期: 2026-09-07
|
||||
|
||||
症狀: leo 打開 `tech_projects/`,一個 repo 旁邊躺著 `ISEP-wt-122ship`/`ISEP-wt-117`/`ISEP-wt115`/
|
||||
`InkStoneCo-wt-112`/`course_gen-ticket-3-notes`/`ax-courses-ticket1`…。他原話:
|
||||
「你會產生大量的同一個頭不同尾巴的 repo,全部拆開就更亂了」「禁止這樣產出一大堆資料夾」。
|
||||
|
||||
實查: 那些不是 repo,是 `line-needs-own-worktree.sh`(ISEP#109,08-29)教工人開的 git worktree。
|
||||
那支閘比較過「旁邊 vs /tmp」——/tmp 會被系統清掉、登記說謊;旁邊一份都沒掉。
|
||||
**一份都沒掉,也一份都沒收**:「收工時 `worktree remove`」只寫在閘訊息裡,
|
||||
沒有任何事件、任何 hook 在線收工那一刻去驗。
|
||||
|
||||
原因: 規則在文字裡,不在機器上(同日 ISEP#109 comment 6629 是同一種病的另一面:出路寫在訊息裡,機器讀不到)。
|
||||
一道閘只管「開」不管「收」,等於把清理交給每一條線的記性——而線收工就消失了,記性跟著消失。
|
||||
|
||||
正確做法:
|
||||
- 分身住 repo **裡面**(`<repo>/.worktrees/<票 repo>-<票號>`,走 `.git/info/exclude`):Finder 看不到、
|
||||
`git status` 看不到、`git worktree list` 找得到。判準是「leo 在 Finder 只看得到一個資料夾」。
|
||||
- **同一支閘**多掛 PostToolUse `Agent|Task`:從派工單的【工單】認出分身,推了且乾淨就收;
|
||||
沒推就點名分支與路徑(exit 2),不 force、不刪。教你開的和替你收的是同一件事的兩半,不拆成兩支。
|
||||
- 「推了沒」只有一份實作(`scripts/worktree`,三態:有/沒有/問不到——問不到不當成沒推,也不收)。
|
||||
- 現場整理是同一支工具的 `sweep`:預設只列不動,`--apply` 只收已推乾淨的;`--skip` 是操作者點名,不是判準。
|
||||
- 規約:`docs/governance/worktree-placement.md`。
|
||||
|
||||
📌 推廣:**一道閘若教人做一件「之後要還」的事(開 worktree、蓋戳記、借共用目錄),
|
||||
「還」那一步也要長在某個事件上**,不然它必然被留下。收工的事件是 PostToolUse(Agent|Task),
|
||||
票號就在那裡(`baton-handback-guard.sh`/`issue-status-autoflip.sh` 都站在同一個位置)。
|
||||
|
||||
@@ -5,3 +5,4 @@
|
||||
- 本 repo 不放 `.env`/任何金鑰真身(D36「金鑰只有一個家」);也不放 `_archive/`。
|
||||
- ISEP 的 wiki 只記 ISEP 自己的事,不複製 InkStoneCo 的 wiki 內容(複製即 fork,fork 即漂移)。
|
||||
- 環境(hooks/commands/skills/scripts)與知識(wiki/docs)雖然裝在同一個 repo,改動理由不同——環境變更要同步本機+雲端兩份,知識變更只影響這個 repo 自己被讀到什麼。
|
||||
- 一個 repo 在檔案系統上只有一個資料夾:一條線的分身(git worktree)住 `<repo>/.worktrees/`,禁止在專案目錄旁邊產出 `<repo>-wt-…`/`<repo>-ticket…` 這類同頭不同尾的資料夾;開用 `scripts/worktree open`、收工 `scripts/worktree close`,忘了收的由 `line-needs-own-worktree.sh`(PostToolUse)替你收(規約 `docs/governance/worktree-placement.md`,inkstone/ISEP#147)。
|
||||
|
||||
Reference in New Issue
Block a user