From 7701b04701d5b25ddb656f6bb9c1aae2c1582092 Mon Sep 17 00:00:00 2001 From: Taiga Date: Sat, 17 Oct 2026 20:21:30 +0000 Subject: [PATCH] [2026-10-17 20:21:30] taiga-vault: family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md --- .../2026-10-17-mode-flip-filemode-fix.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md diff --git a/family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md b/family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md new file mode 100644 index 00000000..5035e770 --- /dev/null +++ b/family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md @@ -0,0 +1,55 @@ +--- +date: 2026-10-17 +tags: [vault-sync, git, mode-flip, fix] +--- + +# 2026-10-17 — mode-flip 644↔755: fileMode выключен в sync-vault.sh + +## Симптом + +В `/tmp/vault-sync.log` накопилось **1705 строк `mode change`** (файл на 51 316 строк). Фазы `syncthing` / `syncthing-out` каждые 5 минут создавали коммиты вида: + +``` +[2026-10-17 20:20:35] syncthing-out: "work/zoom-transcripts/2026-10-15 ..." work/zoom-transcripts/index.json + 3 files changed, 0 insertions(+), 0 deletions(-) + mode change 100644 => 100755 work/zoom-transcripts/index.json +``` + +и обратные `100755 => 100644`. Содержимое не менялось — пустые коммиты с режимом. + +## Причина + +- `/obsidian-syncthing` (клон, куда пишет телефон через Syncthing): `core.fileMode = true` +- `/vault` (агент): `core.fileMode = false` + +Syncthing на телефоне/десктопе пишет файлы как `-rwxrwxr--` (0754/0755), агентский клон — 0644. Оба коммитят в один bare → режим «пинг-понгом» уезжает и возвращается. Класс описан в skill `vault-sync-infrastructure` (случай 2026-09-26, `personal/tech`), там же стояло «решение владельца, Taiga молча не меняет». + +## Что сделано + +В `/opt/data/sync-vault.sh` добавлен идемпотентный блок перед тремя фазами: + +```bash +for d in /vault /obsidian-syncthing; do + [ "$(git -C "$d" config --get core.fileMode || true)" = "false" ] \ + || git -C "$d" config core.fileMode false || true +done +``` + +Ставится **каждый прогон**, а не разово: `.git/` клона `/obsidian-syncthing` сам синкается Syncthing'ом с других устройств и может быть перезаписан (та же механика, что с флипом `origin` 2026-09-26). + +## Проверка + +- `bash -n /opt/data/sync-vault.sh` — ок +- `git -C /vault config --get core.fileMode` → `false`; `git -C /obsidian-syncthing config --get core.fileMode` → `false` +- два прогона подряд: HEAD bare до `c71c153c7b90…`, после `c71c153c7b90…` — **новых коммитов нет**, в логе только `Already up to date.` +- `git status --porcelain` пуст в `/vault` и `/obsidian-syncthing` +- строки `mode change` после 20:21:02 не появляются (последние три — применение старого коммита `c71c153` фазой 1, не новый churn) + +## Откат + +```bash +# убрать блок из /opt/data/sync-vault.sh +git -C /obsidian-syncthing config core.fileMode true +``` + +На ZFS exec-бит для заметок смысла не несёт, `fileMode=false` безопасен. Разовая нормализация через `git add --chmod=644 -A` без выключения `filemode` бесполезна — вернётся на следующем массовом проходе Syncthing.