it-swarm.com.de

SVN: Stamm durch Ast ersetzen

Was ist der beste Weg, um einen der Zweige eines Subversion-Repositorys zum neuen Trunk zu machen?

Das gesamte System wurde grundlegend umgeschrieben: Dinge wurden verschoben, umgeschrieben, ersetzt, entfernt, umbenannt usw. Der umgeschriebene Code wurde getestet und kann nun den alten Trunk ersetzen.

Grundsätzlich ist die alte Hauptleitung (Trunk 5) markiert und endet hier. Der umgeschriebene Zweig (Zweig 6) soll der neue Hauptzweig (Stamm 7) werden:

 Kofferraum (1) -> Kofferraum (2) -> Kofferraum (5) -> × + -> neue Kofferraum (7) 
\\ | 
 Gabel fusionieren ??? 
\\ | 
 + -> Verzweigung (3) -> Verzweigung (4) -> Verzweigung (6) - + 

Alle laufenden Änderungen aus dem alten "Trunk" sind bereits in der "Rewritten Branch" enthalten

Wie kann ich das machen?

151
Jacco

Verwenden Sie svn move , um den Inhalt des alten Trunks an einen anderen Ort zu verschieben und benennen Sie den Zweig anschließend in Trunk um.

Beachten Sie, dass das Kopieren und Verschieben in svn wie Dateivorgänge funktioniert. Sie können sie zum Verschieben/Kopieren von Inhalten in Ihrem Repository verwenden. Diese Änderungen werden auch versioniert. Stellen Sie sich "Verschieben" als "Kopieren + Löschen" vor.

[EDIT] Nilbus hat mich soeben darüber informiert, dass bei Verwendung von svn move Zusammenführungskonflikte auftreten.

Ich denke immer noch, dass dies der richtige Ansatz ist. Dies führt zu Konflikten. Wenn Sie jedoch sorgfältig zusammenführen, können Sie davon ausgehen, dass Sie keine Daten verlieren. Wenn Sie das stört, verwenden Sie ein besseres VCS wie Mercurial oder Git .

117
Aaron Digulla

Ich bin damit einverstanden, den Befehl svn move zu verwenden, um dieses Ziel zu erreichen.

Ich weiß, dass andere hier es ungewöhnlich finden, aber ich mache es gerne so. Wenn ich einen Feature-Zweig habe und bereit bin, ihn mit einem Stamm zusammenzuführen, der ebenfalls erheblich geändert wurde, füge ich ihn zu einem neuen Zweig zusammen, der normalerweise den Namen <FeatureBranchName>-Merged Trägt. Dann löse ich Konflikte und teste den zusammengeführten Code. Sobald das erledigt ist, verschiebe ich den Kofferraum in den Tags-Ordner, damit ich nichts verliere. Zuletzt lege ich meinen <FeatureBranchName>-Merged In den Kofferraum.

Zusätzlich bevorzuge ich es, die Arbeitskopie zu vermeiden, wenn ich die Bewegungen mache. Hier sind Beispiele der Befehle:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Anmerkung: Ich benutze 1.5

65
Ryan Cook

Ich habe mir gerade dieses Problem angesehen und die Lösung, mit der ich sehr zufrieden war, war die Ausführung

svn merge --ignore-ancestry trunk-url branch-url

auf der Arbeitskopie meines Kofferraums.

Hiermit wird nicht versucht, Änderungen in historischer Weise anzuwenden (Änderungen im Kofferraum beizubehalten). Es "wendet einfach das Differential" zwischen dem Stamm und dem Zweig an. Dadurch entstehen für Ihre Benutzer keine Konflikte in den Dateien, die nicht geändert wurden. Sie werden jedoch Ihre historischen Informationen aus dem Zweig verlieren, aber das passiert, wenn Sie trotzdem eine Zusammenführung durchführen.

12
user349819

Empfehlen Sie, diese Änderungen über das Repository-Browser-Tool vorzunehmen.

Der Versuch, große Lösch- und Verschiebevorgänge über die Arbeitskopie auszuführen, ist eine gute Möglichkeit, die Arbeitskopie zu beenden. Wenn Sie gezwungen sind, die Arbeitskopie zu verwenden, führen Sie nach jedem Lösch- oder Verschiebevorgang inkrementelle Festschreibungen durch und aktualisieren Sie Ihre Arbeitskopie nach jeder Festschreibung.

8
Chris Nava

Wenn Sie die Verzweigung zum neuen Trunk machen möchten (dh alle Änderungen in dem Trunk entfernen möchten, die seit dem Erstellen der Verzweigung vorgenommen wurden), können Sie 1. eine Verzweigung des Trunks erstellen (für Sicherungszwecke) 2. "Änderungen rückgängig machen "auf dem Trunk (wählen Sie alle Revisionen aus, nachdem der Zweig erstellt wurde. 3. Führen Sie den Zweig wieder zum Trunk zusammen.

Die Geschichte sollte so bleiben.

Grüße, Roger

3
rboerdijk

@Aaron Digulla- und @kementeus-Lösungen sind funktionsfähig. In Subversion 1.4-Repositorys können Kopier-/Verschiebevorgänge die zukünftige Migration in eine andere Repository-Struktur oder die Aufteilung von Repositorys erschweren.

Ich glaube, dass die Verbesserungen von 1.5 eine bessere Auflösung des Verschiebungs-/Kopierverlaufs beinhalten, sodass dies wahrscheinlich kein Problem für ein 1.5-Repository darstellen würde.

Für ein 1.4-Repository würde ich empfehlen, svnadmin dump Und svndumpfilter zu verwenden, um die Bewegung des vorhandenen Trunks an einer anderen Stelle durchzuführen, und dann den Zweig mit demselben Mechanismus zum Trunk zu verschieben. Laden Sie die beiden Dumpfiles in ein Test-Repository, überprüfen Sie sie und verschieben Sie sie in die Produktion.

Natürlich sollten Sie Ihr vorhandenes Repository sichern, bevor Sie beginnen.

Auf diese Weise wird die Historie ohne explizite Aufzeichnung des Verschiebens/Kopierens beibehalten und die zukünftige Reorganisation unter Beibehaltung der Historie vereinfacht.


Bearbeiten: Wie gewünscht, die Dokumentation des 1.4-Verhaltens aus dem 1.4 Red-Bean-Buch, Filtering Repository History

Außerdem können kopierte Pfade zu Problemen führen. Subversion unterstützt Kopiervorgänge im Repository, bei denen ein neuer Pfad erstellt wird, indem ein bereits vorhandener Pfad kopiert wird. Es ist möglich, dass Sie zu einem bestimmten Zeitpunkt in der Lebensdauer Ihres Repositorys eine Datei oder ein Verzeichnis von einem von svndumpfilter ausgeschlossenen Speicherort an einen von ihm eingeschlossenen Speicherort kopiert haben. Um die Speicherauszugsdaten autark zu machen, muss svndumpfilter immer noch den Zusatz des neuen Pfads anzeigen - einschließlich des Inhalts aller von der Kopie erstellten Dateien - und diesen Zusatz nicht als Kopie aus einer Quelle darstellen Das ist in Ihrem gefilterten Dump-Datenstrom nicht vorhanden. Da das Subversion-Repository-Dump-Format jedoch nur anzeigt, was in jeder Revision geändert wurde, ist der Inhalt der Kopierquelle möglicherweise nicht sofort verfügbar. Wenn Sie den Verdacht haben, dass sich in Ihrem Repository Kopien dieser Art befinden, möchten Sie möglicherweise Ihre eingeschlossenen/ausgeschlossenen Pfade überdenken, einschließlich der Pfade, die als Quellen für Ihre mühsamen Kopiervorgänge dienten.

Dies gilt für Migrationen/Reorganisationen mit svndumpfilter. Es gibt Zeiten, in denen ein wenig zusätzliche Arbeit später viel zusätzliche Arbeit einsparen kann. Wenn Sie die einfache Verwendung von svndumpfilter für zukünftige Migrationen/Reorganisationen verfügbar halten, wird das Risiko bei relativ geringen Kosten gemindert.

3
Ken Gentle

Die obigen Antworten funktionieren zwar, sind jedoch keine bewährten Methoden. Der neueste SVN Server- und Client-Track wird für Sie zusammengeführt. So weiß svn, welche Revisionen Sie in einem Zweig zusammengefasst haben und von wo. Dies ist sehr hilfreich, wenn ein Zweig auf dem neuesten Stand gehalten und dann wieder in den Stamm eingegliedert wird.

Unabhängig davon, welche Version von Subversion Sie verwenden, gibt es eine bewährte Methode, um Änderungen in einem Zweig wieder in den Trunk zu übertragen. Dies wird im Subversion-Handbuch beschrieben: Versionskontrolle mit Subversion, Kapitel 4. Verzweigen und Zusammenführen, Synchronisieren einer Verzweigung .

2
chopp3r