From 87cec237df9201c156ba0a0a0bf75d26b54b12f3 Mon Sep 17 00:00:00 2001 From: Taiga Date: Sat, 26 Sep 2026 09:12:32 +0000 Subject: [PATCH] [2026-09-26 09:12:32] taiga-vault: family/documents/vault-sync/2026-09-26-mode-flip-644-755.md --- .../2026-09-26-mode-flip-644-755.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 family/documents/vault-sync/2026-09-26-mode-flip-644-755.md diff --git a/family/documents/vault-sync/2026-09-26-mode-flip-644-755.md b/family/documents/vault-sync/2026-09-26-mode-flip-644-755.md new file mode 100644 index 00000000..8fcc36b2 --- /dev/null +++ b/family/documents/vault-sync/2026-09-26-mode-flip-644-755.md @@ -0,0 +1,81 @@ +--- +title: Mode-flip 100644 → 100755 в personal/tech (54 файла) +type: log +namespace: family +tags: [vault, sync, git, noise, permissions, zfs] +date: 2026-09-26 +--- + +# Смена режима файлов 100644 → 100755 — новый класс шума в vault + +**Когда:** 2026-09-26, тики sync-vault 09:05:28 / 09:06:24 / 09:10:28 UTC. +**Статус:** sync штатный (exit 0, `Pushed ✓` ×3, три SHA равны `b53dd70a`, +`git status --porcelain` пуст в обоих клонах, маркеров конфликта 0, ошибок лога 0). +Данные не затронуты — менялись **только права файлов**, содержимое то же. + +## Что произошло + +Коммит `b53dd70a` (фаза `syncthing`, автор Taiga, 09:10:28) содержит **54 файла** +`personal/tech/*.md` со сменой режима `100644 → 100755`, `0 insertions(+), 0 deletions(-)`. +Плюс два коммита тика 09:05 — `51722b27` (4 файла `personal/plans/music-tags-review/*`) +и `622c1bb8` (1 файл `1-needs-decision.md`). Итого за один тик 59 файлов стали +«исполняемыми» в git. В истории bare это **первый случай**: из последних 500 коммитов +flip содержат ровно эти три. + +## Причина (по следам на диске) + +1. `/obsidian-syncthing` — клон, куда пишет телефон через Syncthing; у него + `core.filemode = true` (у `/vault` — `false`, поэтому Taiga-сторона flip-ов не даёт). +2. Все файлы и сам каталог `personal/tech` в этом клоне имеют **ctime = 2026-09-26 09:06:38** + при старых mtime (May 30 … Sep 26). То есть в 09:06:38 каталог переписан целиком + (новые inode) — похоже на массовый проход Syncthing-демона по папке, mtime при этом + сохранены. +3. На диске все файлы датасета выглядят как **mode 770 (`-rwxrwx---`)**: NFSv4 ACL на ZFS + синтезирует бит `x` в `stat`/`ls`, даже если писатель просил 0644. +4. Новые inode ⇒ git инвалидирует stat-кэш ⇒ `git add -A` перечитывает файл и видит + exec-бит ⇒ при `filemode=true` фиксирует `100755`. + +Итог: не git и не sync ломаются, а ZFS-ACL + `core.filemode=true` вместе дают +разовый шум при каждом пересоздании файла Syncthing-демоном. + +## Что это значит на практике + +- Безвредно: содержимое заметок не менялось, данные не терялись, Obsidian показывает + те же заметки. +- Трекается 51 файл как `100755` (остальные 509 — `100644`, 4 — симлинки `120000`). +- Эффект будет **повторяться по нарастающей**: в `/obsidian-syncthing` 251 из 778 файлов + уже с exec-битом на диске, и каждый переписанный папкой Syncthing файл даст такой же + flip. В логе уже 116 строк `mode change`. +- Хуже становится не от самих прав, а от **шумной истории**: сообщение коммита перечисляет + все 54 имени файлов одной строкой (см. `/tmp/vault-sync.log`, строка 21392). + +## Рекомендация (решение за Алексеем) + +Заглушить класс целиком — выключить учёт режима в клоне, куда пишет телефон: + +```bash +git -C /obsidian-syncthing config core.fileMode false +``` + +Это ровно то, что уже стоит в `/vault` (`core.filemode=false`). Для репозитория заметок +exec-бит смысла не несёт, так что на данные это не влияет. Whitespace-вариант — +разово нормализовать уже запущенные 51 файл (`git add --chmod=644 -A` + коммит), но без +выключения `filemode` они вернутся при следующем массовом проходе Syncthing. + +Taiga конфиг молча не правила — жду решения. + +## Как воспроизвести диагностику + +```bash +# 1. есть ли flip в свежем коммите +git --git-dir=/vault.git diff --raw HEAD~1 HEAD | awk '{print $1,$2,$6}' | head + +# 2. распределение режимов в bare +git --git-dir=/vault.git ls-files -s | awk '{print $1}' | sort | uniq -c + +# 3. ctime каталога против mtime файлов в клоне телефона +find /obsidian-syncthing/personal/tech -maxdepth 1 -printf '%T+ %C+ %m %p\n' | head + +# 4. core.filemode по клонам +for d in /vault /obsidian-syncthing; do echo -n "$d: "; git -C $d config --get core.fileMode; done +```