[2026-09-04 02:07:27] taiga-vault: family/documents/vault-sync/2026-09-04-git-identity-loss-silent-commit-failure.md family/how-to/vault-git-sync.md

This commit is contained in:
Taiga
2026-09-04 02:07:27 +00:00
parent 2b45264f28
commit 14c3ad3a21
2 changed files with 56 additions and 0 deletions
@@ -0,0 +1,54 @@
# 2026-09-04 — Потеря git identity → молчаливый отказ коммитов в sync
## Симптом
Трёхфазный sync (`/opt/data/sync-vault.sh`) отрабатывал с exit 0 и «Pushed ✓» по всем
фазам, но изменения с телефона (клон `/obsidian-syncthing`) НЕ доходили до bare-репозитория.
- `git status --porcelain` в `/obsidian-syncthing` показывал staged `M`/`D`/`A` — файлы
индексировались (`git add -A`), но коммит не происходил.
- В логе `/tmp/vault-sync.log` — только «Pushed ✓» + «Already up to date.» без единой
строки `[main <hash>]` после 2026-09-02 12:17.
## Причина
В контейнере отсутствовала git identity (`user.name`/`user.email` не заданы):
```
git commit → fatal: unable to auto-detect email address (got 'root@4e97770b2f2f.(none)')
```
`sync-vault-lib.sh` глушит ошибку коммита (`2>/dev/null || true`), поэтому фаза «успешно»
шла дальше: fetch/merge/push не находили новых коммитов → «Already up to date.».
Identity жила в `/root/.gitconfig`, который **не переживает рекреацию контейнера**.
Последний коммит со старой identity — 2026-09-02 12:17 (4bcd0987, `Taiga <taiga@hermes>`),
после инцидента hermes-taiga-crashloop и пересоздания контейнера (бэкапы
`.bak-per-user-20260902-1229`) конфиг слетел. Изменения с телефона копились
~1.5 суток (до 2026-09-04 02:06).
## Исправление
В `/opt/data/sync-vault.sh` добавлена идемпотентная установка identity при каждом запуске
(рядом с уже существующим safe.directory — тот же паттерн):
```bash
git config --global user.name "Taiga"
git config --global user.email "taiga@hermes"
```
Проверено: sync закоммитил все накопленные изменения одним коммитом `2b45264`
(23 файла, +654/459, автор `Taiga <taiga@hermes>`), все три репозитория сошлись на нём,
деревья чистые.
## Наблюдение (не блокер)
В коммите много `mode change 100755 => 100644` — нормализация exec-бита, файлы на диске
и в индексе теперь 644, churn не повторяется. Если режимные изменения начнут снова
появляться при записях с телефона — выставить `git config core.filemode false`
в `/obsidian-syncthing` (безопасно на ZFS, см. vault-sync-infrastructure skill).
## Затронутые файлы
- `/opt/data/sync-vault.sh` — добавлена установка git identity
- Коммит `2b45264` в bare `/vault.git` (source of truth)
+2
View File
@@ -14,6 +14,8 @@ tags:
> **STATE 2026-09-02 (позднее обновление):** Eagle/bare repo снова **синхронны** (ahead=0/behind=0, `2fab879`). Ранее (см. ниже) git-sync стоял из-за битых прав `storage/git` — **починено** полной dacl-заменой (`family/documents/vault-sync/2026-09-02-restore-privilege-scope.md` §RESOLVED).
>
> **STATE 2026-09-04:** починена потеря git identity в контейнере Taiga (слетела при рекреации после crashloop 09-02) — коммиты молча не проходили ~1.5 суток, изменения телефона не доезжали до bare. Фикс: `sync-vault.sh` теперь идемпотентно ставит `user.name "Taiga"` / `user.email "taiga@hermes"` при каждом запуске. Накопленное закоммичено (`2b45264`). Подробно: `family/documents/vault-sync/2026-09-04-git-identity-loss-silent-commit-failure.md`.
>
> **⛔ НОВАЯ проблема 2026-09-02 (не решена):** оба **Taiga-клиента** (`/storage/obsidian` и `/storage/obsidian-syncthing`) **отстали на месяц** — HEAD `ceea848` (2026-08-01) vs bare repo `2fab879` (2026-09-02). Причина: контейнер `hermes-taiga` в **crash-loop** (16339 рестартов) — `uv run hermes gateway run` не может докачать депы (pytz/markdown-it-py) с PyPI, т.к. весь HTTP идёт через **мёртвый `socks5://vless-proxy:1080`**, а `UV_CACHE_DIR=/tmp/uv-cache` пустеет на каждом рестарте. Taiga 3-phase sync (крон внутри агента) не выполняется => телефон видит устаревший vault. Подробно: `family/documents/vault-sync/2026-09-02-hermes-taiga-crashloop.md`. Фикс НЕ применён (ждёт Alex).
> **Триггер cron на маке (Eagle) — это launchd, НЕ Hermes cron:** `~/Library/LaunchAgents/com.sync-vault.plist` → `/Users/admin/scripts/sync-vault.sh`, `StartInterval=300` (5 мин). Скрипт `sync-vault-lib.sh` намеренно глушит dead remote (`git fetch` fail → `exit 0`), поэтому launchd показывает `last exit code = 0` даже при фактически стоящем sync. Системный crontab на маке пуст.