Wie ändere ich die UUID der Subversion-Arbeitskopie?

13

Ich habe kürzlich Subversion-Repositorys von einer alten 1.2.3-Version auf 1.6.0 über svnadmin dump / load aktualisiert . Die alten Repositorys verwendeten alle dieselbe UUID (Repositorys wurden durch Kopieren eines Vorlagen-Repositorys erstellt). Ich habe die UUID einiger neuer Repositorys über svnadmin setuuid geändert , um sie eindeutig zu machen. Ich kann meine vorhandenen Arbeitskopien dieser Repositorys nicht einfach verschieben, da die UUIDs unterschiedlich sind. Ich kenne mich mit dem Exportieren der Arbeitskopie und dem Auschecken aus dem neuen Repository aus, habe mich aber gefragt, ob es eine Möglichkeit gibt, die UUID der Arbeitskopie direkt zu ändern, z. B. was svnadmin setuuid für Repositorys tut.

Ioan
quelle

Antworten:

3

Sie müssen alle "Einträge" -Dateien in Ihrem Pulled-Repo bearbeiten. Wenn das Repo viele Verzeichnisse enthält, erledigt find + ein sed-Skript die Aufgabe in Kürze.

John
quelle
17

Neue Antwort seit dem Arbeitskopieformat von Subversion 1.7 . Sie benötigen ein sqlite3Befehlszeilenprogramm.

Im Stammverzeichnis Ihrer Arbeitskopie befindet sich jetzt ein einzelner .svn/Ordner mit einer SQLite-Datenbank. Sie können das aktuelle Repository abfragen, UUIDdas für Ihre Arbeitskopie bekannt ist, mit:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

Infolgedessen kann eine Änderung UUIDdurchgeführt werden mit:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

Erstellen Sie natürlich eine Sicherungskopie der .svn/wc.dbDatei, bevor Sie die Aktualisierungsabfrage aufrufen. Es besteht kaum die Möglichkeit, dass Ihre Repository-Entität eine andere ID hat oder mehrere Zeilen in dieser Tabelle vorhanden sind. Sie können jedoch prüfen, ob Sie unerwartete Ergebnisse erhalten.

Yves Martin
quelle
+1 funktionierte perfekt mit einem verlagerten Repo, das auch die UUID änderte
Amro
8

Hier ist ein Befehl, der den Trick für SVN 1.6 und darunter ausführt:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

Ersetzen Sie old-uuidund new-uuidmit den tatsächlichen IDs.

Emil M
quelle
1
+ 1Danke für die Lösung. Dies funktioniert nicht für Verzeichnisse mit Leerzeichen. "find. -type f -name einträge -exec sed -i 's / alte-uuid / neue-uuid / g' {} \;" ohne doppelte Anführungszeichen scheint zu funktionieren.
Tommy
sry für das Necroing dieses Threads diese Methode hat mir nur eine Menge Zeit gespart .. für andere, die dies ausprobieren, möchte ich nur eine Notiz hinzufügen. Sed auf MACOX scheint eine etwas andere Verwendung zu benötigen, müssen Sie sagen, sed -i "" 's/old-uuid/new-uuid/' und es funktioniert (nur die zusätzlichen leeren Anführungszeichen) ( ref )
Karthik T
2

Die Antwort von Yves Martin hat bei einer Reihe von Arbeitskopien mit SVN 1.8 sehr gut funktioniert, aber wir sind auf Fälle gestoßen, in denen es nicht funktioniert hat.

Das Ausführen von Yves 'Befehl ohne "where id = 1" funktionierte in allen Fällen für uns:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

Als ich nachforschte, warum dies geschah, stellte ich fest, dass beim Verschieben des Repositorys mehrere UUIDs gespeichert werden, entgegen der Intuition von Yves, dass dies niemals passieren sollte.

Ein neuer Eintrag in die REPOSITORY-Tabelle wird nach einem Umzug hinzugefügt, anstatt den vorhandenen zu aktualisieren. Dabei wird eine inkrementierte ID mit dem neuen Repository-Stammverzeichnis und seiner UUID gespeichert. Die Fälle, die nicht richtig funktionierten, waren also die Arbeitskopien, die bereits in der Vergangenheit verschoben wurden: Der Befehl schien zu funktionieren, aber nur die ursprüngliche UUID wurde geändert, nicht die derzeit verwendete.

Mit diesem Befehl kann die Liste der gespeicherten Roots und UUIDs in einer Arbeitskopie überprüft werden:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

Ich stelle schließlich fest, dass ich für Windows-Befehlszeilen- / Batchdateien einen anderen Satz von Anführungszeichen verwenden musste:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"
Julien Barnoin
quelle
Vielen Dank für die Details, als eine Arbeitskopie verschoben wurde. Mir war dieses Verhalten nicht bekannt
Yves Martin
1

Der Abschnitt " Verwalten von Repository-UUIDs " in svn red-bean book enthält möglicherweise die Antwort, nach der Sie suchen.

yasouser
quelle
Dieser Abschnitt befasst sich mit Repository-UUIDs, nicht mit Arbeitskopie-UUIDs.
Ioan
@Ioan: Zitat aus diesem Abschnitt: Für Leute, die frühere Versionen von Subversion als 1.5 verwenden, sind diese Aufgaben etwas komplizierter. Sie können die UUID eines Repositorys explizit festlegen, indem Sie einen Repository-Dump-Datei-Stub weiterleiten, der die neue UUID-Spezifikation über svnadmin load --force-uuid REPOS-PATH enthält.
Yasouser
1
Nein, ich spreche nicht von Repository- UUIDs, sondern von Arbeitskopie- UUIDs. Arbeitskopien sind die gleichen wie eine Kasse.
Ioan
Sie können die UUID der Arbeitskopie nicht in die des Server-Repos ändern, ohne die Arbeitskopie zu aktualisieren oder an den [neuen / vorhandenen] Speicherort des Repos zu verschieben.
Yasouser