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