fix(gitea): push 撞到別台機器時是本機贏,但不能靜靜地贏
`pushArea` 遇到 non-fast-forward 時會 `git reset --hard origin/<branch>`、
把本機工作副本重新疊上去再推一次,然後回 `{ok:true, changed:true}`——
沒有任何衝突訊號。而 Stop hook 每一輪都在背景 push,所以兩台機器同時聊同一個
人格時,對方的 emotion.json/short-term.jsonl 會被靜默取代,誰都不知道。
「本機工作副本是這台機器的真相來源」這個設計選擇保留,但那條路徑現在要記帳:
* 算出「對方在分歧後改過、而我們正要蓋掉」的檔案交集,連同覆蓋前的遠端 sha
一起回傳 `overwrote`,並寫進 state/sync.json(留最近 10 筆)。
* `sync push` 一律往 stderr 寫一行警告(--quiet 也寫,背景 push 才有痕跡),
正常輸出與 `sync status` 都列得出「蓋掉幾個檔案、上一版是誰」。
* 背景 push 是 detached、輸出丟掉的,所以由 Stop hook 認領未回報的紀錄,
講給使用者聽一次(劇場模式也照講——那是資料被蓋掉)。
* commit 訊息也寫進「覆蓋 N 個檔案,上一版 <sha>」,被蓋掉的內容仍可用
`git -C <人格>/.sync/<區> show <sha>:<檔案>` 取回。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -104,6 +104,18 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sync pull --session <PERSONA_SE
|
||||
- 以 **本機** 為準 → `sync push`(會蓋掉遠端)
|
||||
3. **不要自己選**。記憶被蓋掉是不可逆的。
|
||||
|
||||
### push 撞到別台機器時是本機贏——但會記帳
|
||||
|
||||
`sync push`(包含每輪對話後的背景推送)遇到遠端比較新時,會**以本機為準覆蓋遠端**,
|
||||
因為本機的工作副本才是這台機器的真相來源。這條路可以走,但不會安靜地走:
|
||||
|
||||
- 回報「覆蓋了哪幾個檔案、上一版是哪個 commit」,並記進 `state/sync.json`。
|
||||
- `sync status` 列得出來;下一輪的 `Stop` hook 會把它講給使用者聽一次。
|
||||
- 被蓋掉的內容還在 clone 的歷史裡:
|
||||
`git -C <人格>/.sync/files show <上一版 sha>:<檔案>`。
|
||||
|
||||
看到這種回報就**告訴使用者**:另一台機器可能正在用同一個人格。要救回舊版就從上面那行取出來。
|
||||
|
||||
## 殘留的 git 鎖
|
||||
|
||||
`push`/`pull` 跑到一半被中斷(sub agent 被砍、視窗關掉)會在 clone 裡留下 `.git/index.lock`,
|
||||
|
||||
Reference in New Issue
Block a user