[2026-09-26 09:12:32] taiga-vault: family/documents/vault-sync/2026-09-26-mode-flip-644-755.md

This commit is contained in:
Taiga committed 2026-09-26 09:12:32 +00:00
1 parent b53dd70a15
commit 87cec237df
1 file changed
+81
@@ -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
```