[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:
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.
|
||||||
Reference in new issue
Block a user