Files
obsidian-vault/family/documents/vault-sync/2026-09-02-dubious-ownership-and-merge-cleanup.md
T

49 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [vault-sync, git, incident, safe-directory, taiga, merge-conflict]
created: 2026-09-02
updated: 2026-09-02
status: resolved 2026-09-02 — sync-vault.sh fixed (safe.directory /vault.git), sync работает, конфликты разрешены
---
# Incident 2026-09-02: hermes-taiga vault-sync молча падал (dubious ownership /vault.git) + разбор накопленных merge-конфликтов
**Контекст:** после crash-loop (см. [[2026-09-02-hermes-taiga-crashloop]]) агент поднялся, первый cron-sync в 12:13 отработал **молча и впустую** — все 3 фазы в логе: `Fetch failed (origin offline?) — skipping merge/push`. На вид graceful skip, по факту sync стоял.
## Корень: safe.directory без /vault.git
`sync-vault.sh` добавлял `safe.directory` только для `/vault` и `/obsidian-syncthing`, но **НЕ для `/vault.git`** — bare remote, из которого все три фазы делают `git fetch file:///vault.git`. Я (агент) работаю под root, а `/vault.git` принадлежит uid 950 (truenas_admin) → git отказывает: `fatal: detected dubious ownership in repository at '/vault.git'` (exit 128). `sync-vault-lib.sh` глушит ошибку fetch (`exit 0`) → каждый час: commit локально, push не происходит, изменений никто не видит. Тот же паттерн «молчаливой смерти sync» уже фиксировался для launchd на маке (см. [[2026-09-02-restore-privilege-scope]] §1).
**Фикс (в `/opt/data/sync-vault.sh`):** идемпотентный цикл вместо двух безусловных `--add` (которые к тому же дублировали записи в ~/.gitconfig при каждом запуске):
```bash
for d in /vault /obsidian-syncthing /vault.git; do
git config --global --get-all safe.directory 2>/dev/null | grep -qxF "$d" \
|| git config --global --add safe.directory "$d"
done
```
## Разбор мержа после фикса
Повторный прогон (12:14) прошёл: фаза 1 запушила телефонные изменения (новый файл `work/projects/cpm-extension-health-pixels-privacy-triage.md`), фаза 2 дала **merge-конфликт**, фаза 3 утащила конфликтную версию в телефонную копию.
### Конфликт 1 (сегодняшний): `family/how-to/truenas-sata-ports-and-zfs-pools.md`
- Локальная сторона (HEAD, коммит 811f807): правка сессии от 17.08 поверх базы 01.08 — агент был в crash-loop весь август, `/vault` отставал на месяц (база ceea848/01.08).
- Сторона origin/main: актуальная линия bare (правки до 24.08: падение HGST, спасение данных на IronWolf, пересоздание пула RED_2TB ONLINE).
- `sync-vault-lib.sh` закоммитил маркеры (`d5ede3f merge conflict — committed markers`) и запушил → маркеры ушли на телефон.
- **Разрешено:** взята версия origin/main (^2, 6807731) — локальная сторона полностью устаревшая/поглощённая, уникальных данных нет. Коммит `5bdd673` запушен.
### Конфликты 2 и 3 (старые, с 18.06.2026, маркеры `nas/main`)
Нашлись при проверке `git grep '^<<<<<<< '` — закоммичены ещё июньским инцидентом (`68090c8 [2026-06-18] taiga-vault: merge conflict — committed markers`), висели в контенте vault (и на телефоне) больше 2 месяцев:
- `family/how-to/switch-emulation-rom-infra.md` — различие только в плейсхолдере apikey (`JACKETT_KEY` vs `***`) → оставлен `JACKETT_KEY`.
- `family/how-to/htpc-emulators-setup.md` — блок Ryujinx: у nas/main детальная таблица (компоненты, 36 игр, symlink-схема), у HEAD более свежая дата статуса (22.06) → объединено: дата 22.06 + полный блок nas/main. Данные не потеряны.
- Разрешение в коммите вместе с заметкой; запушено в bare, фаза 3 донесёт до телефона.
## Уроки
1. **`/vault.git` должен быть в safe.directory** — скрипт теперь добавляет его сам, идемпотентно.
2. **`sync-vault-lib.sh` коммитит маркеры конфликта** (`git add -A && git commit "merge conflict — committed markers"`) и пушит их — маркеры уезжают на телефон. После любого sync желательна проверка `git grep '^<<<<<<< '`; сам скрипт — кандидат на улучшение (коммитить маркеры, но НЕ пушить до ручного разрешения, или помечать).
3. После crash-loop/долгого простоя агента merge локальной устаревшей копии с bare почти гарантированно даст конфликты — локальная сторона обычно устаревшая, истина в bare/маке.
## Связанные заметки
- [[2026-09-02-hermes-taiga-crashloop]] — родитель: почему sync стоял с августа
- [[2026-09-02-restore-privilege-scope]] — родитель: поломка прав после restore (решена), паттерн «молчаливый sync»
- [[vault-git-sync]] / [[obsidian-sync]] — архитектура sync