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

5.8 KiB
Raw Blame History

tags, created, updated, status
tags created updated status
vault-sync
git
incident
safe-directory
taiga
merge-conflict
2026-09-02 2026-09-02 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 при каждом запуске):

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/маке.

Связанные заметки