Vault-Sync: Wechsel auf einen anderen Forgejo-Server (Historie prüfen, Verbindung trennen) #223
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#223
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Teil von iris/Iris#76 (Vault-Synchronisation).
Befund
Ein Vault, das schon synchronisiert, kann nicht sauber auf einen anderen Forgejo-Server umziehen (Linux-Server und Mac-Server verhalten sich gleich):
configuresetzt bei vorhandenemoriginnur die URL um (Moduscredentials_updated) und prüft nicht, ob die Historie des neuen Repos zum Vault passt. Die Prüfung (merge-base) kommt erst beim nächsten Abgleich: Statuserror, „Die Historie des Servers passt nicht zu diesem Vault“. Der Server bleibt im Fehlerzustand, bis die URL zurückgesetzt wird.configuremitunrelated_historyab. Ein Vault nur mit Dateien scheitert bei gleichnamigen Dateien ancollisionsund wird zurückgesetzt.Auslöser: Test mit einem Vault auf der Mac-VM (Historie aus dem Linux-Server-Repo) gegen das Repo des Mac Studio (eigene Historie).
Ziel
Ein Nutzer kann sein Vault jederzeit mit einem anderen Forgejo-Server verbinden, ohne Daten zu verlieren und ohne Handarbeit. Es wird nichts gelöscht und nichts überschrieben.
Entscheidungen (grill-me, 2026-10-28)
configurepusht das Vault sofort (Moduspublished, mit Fortschritt über/vault/sync/progress) und meldet Erfolg oder einen klaren Fehler. Bei einem Fehler bleibt die alte URL bestehen.git merge --allow-unrelated-histories. Beide Historien bleiben erhalten, es wird nichts gelöscht. Damit entfallenunrelated_historyundcollisionsals Fehlerarten.conflict, der Job läuft weiter, kein Push bis alle gelöst sind. Identische Dateien verschmelzen still und erscheinen nicht in der Liste.both: die Server-Version kommt alsName (Server).mddazu), zusammenführen (merged, wie bisher)..obsidian/*.jsongibt es nur meine und Server.POST resolvepro Pfad); der Merge läuft, sobald alle Pfade eine Wahl haben. Der Nutzer kann abbrechen und später weitermachen.originzeigt direkt auf den neuen Server. Bis alle Konflikte gelöst sind, ruht der Abgleich (Regel aus #76); Lampe und Info-Fenster sagen das in Klartext. Zurück geht über „Vault verbinden“ mit dem alten Server (der Merge wurde abgebrochen, am Vault ist nichts verändert).union):git init+ Commit der Dateien, Fetch, Merge mit--allow-unrelated-histories, stattcheckout. Berührt LFS-Download, Fortsetzungs-Marker und leere Zeigerdateien für fehlende Anhänge (_download_and_checkout) und muss mit vielen Anhängen getestet werden. Bis dahin meldet dieser Pfad weitercollisions.Wire-Protokoll
POST resolve: neue Wahlboth.POST configure: stattunrelated_history/collisions(Pfade 1 und 2) meldet die Antwort den Konfliktzustand;GET conflictsliefert Konflikte ohne Basis.Nicht Teil dieses Issues
Verwerfen der eigenen Historie (Route zum Trennen, Sicherungs-Bundle, Bestätigung) entfällt. Bleibt als spätere Option, falls ein Nutzer bewusst neu anfangen will.
Beim Bau zu prüfen (noch nicht gelesen)
messageoder einen eigenen Text fürunrelated_history(VaultSyncModel.swift)?.obsidian/*.jsonbeim Server oder im Client liegt.Abnahmekriterien (Entwurf)
Stand 2026-10-28: grill-me abgeschlossen
VaultSyncCore.swift:827-829: bei vorhandenem Remote nurset-url, keine Historienprüfung). Der Wechsel ist in der Oberfläche erreichbar: Das Info-Fenster der Lampe öffnet bei verbundenem Vault wieder den Sheet „Vault verbinden“ (VaultSyncViews.swift:57-60).vault_git_sync.py,vault_sync_routes.py; Mac-Server und Info-Fenster an den genannten Stellen). Nichts gebaut, nichts gemessen.union). Vor dem Bau gilt die Bestätigung des Nutzers.PR #119 gemergt: feat(vault-sync): Wechsel auf anderen Forgejo-Server, fremde Historie zusammenführen (iris/Iris#223)
iris/iris-linux-server#119
Commits:
Stand 2026-10-28: Linux-Server, Pfade 1 und 2 gebaut
configuresetzte bei vorhandenem Remote nur die URL um, bei fremder Historie lehnte es ab oder der Abgleich blieb im Fehlerzustand.vault_git_sync.py):_merge_remoteund_apply_resolutionführen bei fehlendem gemeinsamen Vorfahren mit--allow-unrelated-historieszusammen, statt mit „Historie passt nicht“ abzubrechen. Gleichnamige Dateien mit anderem Inhalt werden Konflikte im bestehenden Mechanismus (Merge abgebrochen, Vault sauber, Statusconflict, kein Push bis zur Auflösung, BasisNone)._switch_remote: Vault mit Remote, aber anderer Adresse. Leerer Zielserver → Push (published); sonst Fetch, bei fremdem Verlauf Zusammenführen, bei gleichem Verlauf übernimmt der nächste Abgleich. Scheitert ein Schritt vor dem Zusammenführen, kommt die alte URL (und der alte Konfliktstand) zurück.unrelated_historyjetzt Zusammenführen.conflict_count(nur wenn > 0). Neue WahlbothinPOST resolve: die eigene Fassung bleibt am Pfad, die des Servers kommt alsName (Server).md(bei NamensgleichheitName (Server 2).md). Für.obsidian/…mit400abgelehnt.tests/test_vault_git_sync.py, 78 Tests grün (echtes git, lokale Bare-Repos). Neu: fremde Historie ohne und mit Konflikt, alle drei Wahlen,bothfür.obsidian/und mit vorhandener Kopie, Wechsel auf leeren Server, Wechsel mit abgelehntem Push (alte URL bleibt), Wechsel auf Spiegel, Wechsel auf fremdes Repo mit Konflikt. Der alte Testtest_configure_refuses_unrelated_history_and_restoresist ersetzt.bothundconflict_countnoch nicht). Wire-Doku (02-Wire-Protokoll.md) noch nicht angepasst: kommt zusammen mit dem Mac-Server, damit sie nicht vorauseilt. Nicht auf iris-server deployt.VaultSyncCore.swift, gleiche Änderung), Clients (Dialog mit zwei Ansichten, Sammelaktionen,both, Lampentext „Der Abgleich ruht“), Pfad 3 (Vault nur mit Dateien,union).tests/test_vault_git.pyläuft gegen den echten Server und scheitert dort in zwei Tests (test_vault_git_log_no_repo_fails_gracefully,test_vault_git_log_parses_commits_with_pipe_in_message); das hat mit dieser Änderung nichts zu tun, ich habe es nicht weiter untersucht.PR #224 gemergt: feat(vault-sync): Mac-Server — Wechsel auf anderen Forgejo-Server, fremde Historie zusammenführen (iris/Iris#223)
#224
Commits:
Stand 2026-10-28: Mac-Server gebaut (gleiche Änderung wie Linux-Server)
VaultSyncCore.swift,VaultSyncController.swift):mergeRemoteundapplyResolutionführen bei fehlendem gemeinsamen Vorfahren mit--allow-unrelated-historieszusammen, statt mit „Historie passt nicht“ abzubrechen. Gleichnamige Dateien mit anderem Inhalt werden Konflikte im bestehenden Mechanismus (Merge abgebrochen, Vault sauber, Basis leer).switchRemote: Vault mit Remote, aber anderer Adresse. Leerer Zielserver → Push (published); sonst Fetch und bei fremdem Verlauf Zusammenführen; scheitert ein Schritt vor dem Zusammenführen, kommt die alte URL (und der alte Konfliktstand) zurück.unrelated_historyjetzt Zusammenführen. Der Merge läuft über einen Haken (VaultSyncSetup.exclusive) unter der Hook-Sperre des Controllers.configuremeldetconflict_count, wenn Konflikte offen sind. Neue WahlbothinPOST resolve(KopieName (Server).md, nummeriert bei Namensgleichheit); für.obsidian/…mit400abgelehnt.scripts/test-vault-sync-core.sh: 216 Prüfungen, 0 Fehler (echtes git, lokale Bare-Repos), darunter neu: fremder Verlauf ohne und mit Konflikt, alle drei Wahlen,bothmit vorhandener Kopie, Wechsel auf leeren Server, abgelehnter Push (alte URL bleibt), Wechsel auf Spiegel, Wechsel auf fremdes Repo mit Konflikt. Die App (Scheme Iris, Debug) baut fehlerfrei (Build in eigenem DerivedData, nicht installiert).bothundconflict_countnoch nicht. Wire-Doku noch nicht angepasst (kommt nach den Clients).both, Lampentext „Der Abgleich ruht“), Wire-Doku, Pfad 3 (Vault nur mit Dateien,union).PR #225 gemergt: feat(vault-sync): Konfliktdialog mit „Beide behalten“ und Sammelaktionen (iris/Iris#223)
#225
Commits:
Stand 2026-10-28: Dialog in Iris und IrisClient (Mac)
VaultSyncModel.swift,VaultSyncViews.swift, geteilt von Iris und IrisClient):.obsidian/…ausgeblendet) und das Menü „Mehrere auf einmal …“: „Überall meine Version / Version vom Server / beide behalten“ für alle offenen Konflikte oder nur für den Ordner der gewählten Notiz. Der Server wendet alles an, sobald die letzte Wahl vorliegt.VaultSyncChoice.both(Wireboth);configureliestconflict_count; die Meldung nach dem Verbinden nennt die Zahl der Konflikte und den Weg („Lampe → Konflikt lösen …“).conflictergänzt: „Der Abgleich ruht, bis alle entschieden sind.“PR #58 gemergt: feat(vault-sync): Konfliktdialog mit „Beide behalten“, Sammelaktionen und iPad-Ansicht (iris/Iris#223)
iris/2ndbrain-ios#58
Commits:
Stand 2026-10-28: IrisRemote (iOS)
VaultSyncModel.swift,VaultSyncViews.swift): gleiche Wahlen wie in Iris und IrisClient..obsidian/…ausgeblendet), „Mehrere“ in der Symbolleiste (alle offenen: überall meine Version / Version vom Server / beide behalten) und im Kontextmenü einer Zeile für den Ordner dieser Notiz.VaultSyncChoice.both,conflict_countausconfigure, Meldung nach dem Verbinden nennt die Konflikte; Erklärung zum Zustandconflict: „Der Abgleich ruht, bis alle entschieden sind.“CODE_SIGNING_ALLOWED=NO, eigenes DerivedData). Nichts aufs Gerät installiert.02-Wire-Protokoll.mdnennt nochunrelated_history), Pfad 3 (Vault nur mit Dateien), echter Durchlauf mit großem Vault (Mac Studio → VM), Lampentext.Localizable.xcstringslag schon vorher geändert im Arbeitsbaum und ist separat alschore(i18n)gemergt (iris-ios#57).PR #129 gemergt: docs(wire): Wechsel auf anderen Forgejo-Server, Wahl both, Konflikte ohne Basis (iris/Iris#223)
alf/2ndbrain#129
Commits:
Stand 2026-10-28: Wire-Doku nachgezogen
Entwicklerdokumentation/02-Wire-Protokoll.md):resolvekenntboth(KopieName (Server).ext,400unter.obsidian/);conflictsnenntbase: nullbei fremdem Verlauf;configure:conflict_count,unrelated_historyentfällt, neuer Abschnitt „Wechsel auf einen anderen Server“ (leerer Server, gleicher Verlauf, fremder Verlauf, Rückfall auf die alte Adresse).vault_git_sync.py, Mac-ServerVaultSyncCore.swift); keine Ausführung nötig.union) meldet weitercollisionsund ist in der Doku so beschrieben; Durchlauf mit großem Vault; Lampentext.PR #120 gemergt: feat(vault-sync): Vault nur mit Dateien — mit dem Verlauf des Servers zusammenführen statt Kollision (iris/Iris#223)
iris/iris-linux-server#120
Commits:
Stand 2026-10-28: Pfad 3 (Vault nur mit Dateien), Linux-Server
vault_git_sync.py): Ein Vault nur mit Dateien wird nicht mehr percheckout -B … --trackverbunden (das scheiterte an gleichnamigen Dateien mitcollisions). Stattdessen:init,fetch, die eigenen Dateien als eigener Verlauf committen (_commit_local_files), Anhänge laden, dann mit dem Verlauf des Servers zusammenführen (merge --allow-unrelated-histories). Gleichnamige Dateien mit anderem Inhalt werden Konflikte im bestehenden Mechanismus (conflict_countin der Antwort). Verlangt der Server LFS, kommt zuerst seine.gitattributesins Vault (nur wenn dort keine liegt), damit eigene Anhänge als LFS-Zeiger im Verlauf stehen und nicht als ganze Dateien hochgeladen werden. Beim Zusammenführen fremder Verläufe wird der LFS-Filter mitgegeben (_merge_lfs_args). Unterbrochenes Einrichten (Markerunion) setzt fort und holt den Commit der eigenen Dateien nach, falls er fehlt.collisionsund_collisionsentfallen.tests/test_vault_git_sync.py, 81 Tests grün (echtes git, lokale Bare-Repos). Neu: Union mit gleichnamiger Datei (Konflikt, nichts überschrieben, danachbothund Push), Union mit identischer Datei (kein Konflikt), Union mit LFS-Remote und eigenem Anhang (Zeiger im Verlauf, Datei im Vault unverändert), unterbrochene Union-Einrichtung mit Fortsetzen. Der Testtest_configure_reports_collisions_and_changes_nothingist ersetzt.PR #226 gemergt: feat(vault-sync): Mac-Server — Vault nur mit Dateien mit dem Verlauf des Servers zusammenführen (iris/Iris#223)
#226
Commits:
Stand 2026-10-28: Pfad 3 (Vault nur mit Dateien), Mac-Server
VaultSyncCore.swift, Test, Kommentar inIrisRemoteServer.swift): gleiche Änderung wie im Linux-Server (iris-linux-server#120):commitLocalFiles(eigene Dateien als eigener Verlauf, bei LFS-Remote zuerst dessen.gitattributes), danachmergeRemotemit--allow-unrelated-historiesstattcheckout -B … --track; gleichnamige Dateien werden Konflikte (.connectedConflicts); der LFS-Filter wird beim Zusammenführen fremder Verläufe mitgegeben (mergeLFSArguments); unterbrochenes Einrichten (Markerunion) holt den Commit der eigenen Dateien nach.collisionsundcollisions(from:)entfallen.scripts/test-vault-sync-core.sh: 226 Prüfungen, 0 Fehler (echtes git, lokale Bare-Repos); neu: Union mit Konflikt und danachboth, Union sauber und mit Verlauf des Servers, identische Datei ohne Konflikt, Union mit LFS-Remote (eigener Anhang als LFS-Zeiger im Verlauf). Schemes Iris und IrisClient bauen fehlerfrei (Debug, nichts installiert).PR #130 gemergt: docs(wire): Vault nur mit Dateien wird zusammengeführt, collisions entfällt (iris/Iris#223)
alf/2ndbrain#130
Commits:
Stand 2026-10-28: Wire-Doku zu Pfad 3
Entwicklerdokumentation/02-Wire-Protokoll.md): „Einrichten“ beschreibt das Vault nur mit Dateien jetzt als Commit der eigenen Dateien plus Zusammenführen (bei LFS-Remote zuerst dessen.gitattributes);collisionswird nur noch als Meldung älterer Server erwähnt; Fortsetzen nach Unterbrechung.PR #227 gemergt: feat(vault-sync): Lampentext bei Konflikt — Abgleich ruht (iris/Iris#223)
#227
Commits:
Stand 2026-10-28: Lampentext bei Konflikt
VaultSyncModel.swiftin Iris/IrisClient und in IrisRemote): Die Lampe zeigt im Zustandconflictjetzt „Abgleich ruht – Konflikt entscheiden“ statt „Konflikt – bitte entscheiden“ (Entscheidung 7 aus dem grill-me).fixedSize) und auf dem iPhone sauber passt.BENUTZERHANDBUCH.md,vault-synchronisation.html) nennen noch den alten Text; die Korrektur gehört in den geplanten Handbuch-Rewrite.PR #59 gemergt: feat(vault-sync): Lampentext bei Konflikt — Abgleich ruht (iris/Iris#223)
iris/2ndbrain-ios#59
Commits:
Stand 2026-10-28: Lampentext bei Konflikt
VaultSyncModel.swiftin Iris/IrisClient und in IrisRemote): Die Lampe zeigt im Zustandconflictjetzt „Abgleich ruht – Konflikt entscheiden“ statt „Konflikt – bitte entscheiden“ (Entscheidung 7 aus dem grill-me).fixedSize) und auf dem iPhone sauber passt.BENUTZERHANDBUCH.md,vault-synchronisation.html) nennen noch den alten Text; die Korrektur gehört in den geplanten Handbuch-Rewrite.PR #229 gemergt: docs(handbuch): Vault-Synchronisation — alle Funktionen und Wege (iris/Iris#223)
#229
Commits:
Stand 2026-10-28: Benutzerhandbuch, Kapitel „Vault-Synchronisation“
Iris/BENUTZERHANDBUCH/Vault-Synchronisation.mdim Vault, daraus gebaut mitdeployment/handbuch/build_handbuch.py; hier eingecheckt ist die generierteIris/Resources/BENUTZERHANDBUCH.md). Neu: Inhaltsübersicht; Tabelle „Was beim Verbinden passiert — alle Fälle“ (leeres Vault, Vault mit Notizen, Vault mit eigenem Verlauf, schon verbunden, jeweils gegen leeres Repository, Repository mit Inhalt, gleichem und fremdem Verlauf); Abschnitt „Den Server wechseln“ (Schritte, drei Fälle, Rückweg, Tipp für große Vaults); Fortschritt, Unterbrechung und Fortsetzen, fehlende Anhänge; Konfliktfenster (Mac, iPad, iPhone), die vier Wahlen inklusive „Beide behalten“ und der Ausnahme.obsidian/…, Sammelaktionen („Mehrere auf einmal …“, Ordner-Wahl, Kontextmenü), Ablauf nach der letzten Entscheidung; Tabelle „Wenn etwas nicht klappt“; Lampentext „Abgleich ruht – Konflikt entscheiden“; neue Einschränkungen (Versionsgeschichte zieht mit um, Abgleich ruht bei offenen Konflikten).configure, Wahlen, Sammelaktionen, Meldungen).macos-iris/Handbuch/,ios/IrisRemote/Handbuch/) ist lokal neu erzeugt und kommt mit dem nächsten App-Build in die Hilfe;[[Wikilinks]]zeigt der Build wie bisher unaufgelöst.Stand 2026-10-28: Images veröffentlicht,
latestgesetztiris-server,iris-hermes,iris-tunnel,iris-hermes-sandbox,iris-web-automation,iris-browser) liegen als v1.6.59 in der Forgejo-Registry (forgejo.lewerken.duckdns.org/iris/…), der Git-Tagv1.6.59ist gepusht, undlatestzeigt auf v1.6.59 (zuvor v1.6.58). Der Build lief auf dem Entwicklungshostalf@iris-server.bothinresolve, Aufräumen alter Git-Server-Token beim Anmelden und Bereitstellen (iris/Iris#230)./healthok).