[2026-10-17 20:21:30] taiga-vault: family/documents/vault-sync/2026-10-17-mode-flip-filemode-fix.md

This commit is contained in:
Taiga committed 2026-10-17 20:21:30 +00:00
1 parent c71c153c7b
commit 7701b04701
1 file changed
+55
@@ -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.