svn: Stamm durch Zweig ersetzen


155

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 ist bereit, den alten Trunk zu ersetzen.

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

Amtsleitung (1) -> Amtsleitung (2) -> Amtsleitung (5) -> × + -> neue Amtsleitung (7)
  \ \ |
  Gabel verschmelzen ???
    \ \ |
     + -> Zweig (3) -> Zweig (4) -> Zweig (6) - +

Alle laufenden Änderungen gegenüber dem alten "Trunk" sind bereits in der "Rewritten Branch" enthalten.

Wie kann ich das machen?

Antworten:


118

Verwenden Sie svn move , um den Inhalt des alten Trunks an eine andere Stelle zu verschieben und den Zweig anschließend in Trunk umzubenennen.

Beachten Sie, dass das Kopieren und Verschieben in svn wie Dateivorgänge funktioniert. Sie können sie verwenden, um Inhalte in Ihrem Repository zu verschieben / zu kopieren, und diese Änderungen werden ebenfalls versioniert. Stellen Sie sich "Verschieben" als "Kopieren + Löschen" vor.

[BEARBEITEN] Nilbus hat mich gerade darüber informiert, dass bei der Verwendung Zusammenführungskonflikte auftreten svn move.

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


1
Wenn Sie dies tun, hat jeder mit Änderungen an einer Arbeitskopie im ursprünglichen Trunk einen Konflikt, selbst wenn seine Änderungen zusammengeführt werden sollten. Dies liegt daran, dass die Dateien gelöscht und erneut hinzugefügt werden. Sie werden als separate Objekte mit separatem Verlauf behandelt.
Edward Anderson

@nilbus: Hast du es versucht? IIRC, SVN zeigt, dass die Dateien gelöscht und erneut gelesen wurden, aber intern weiß es, dass die Dateien verschoben wurden.
Aaron Digulla

Ja. Ich habe zwei Exemplare ausgecheckt. In der ersten Kopie habe ich dir A nach A2 und dir B nach A verschoben. Dann habe ich A nach B und dann A2 nach A verschoben. (Umbenennen und wieder umbenennen.) Beim zweiten Auschecken habe ich eine Datei geändert und versucht, svn aktualisieren. Es kam zu Konflikten, weil die von mir geänderte Datei "gelöscht" wurde. Intern werden keine doppelten Kopien der Dateien gespeichert, aber das Löschen, das Sie sehen, wirkt sich wirklich auf Sie aus, wenn es um Konflikte geht.
Edward Anderson

12
@nilbus: An dieser Stelle möchte ich Linus Torvalds zitieren: "Der Slogan von Subversion war für eine Weile" CVS richtig gemacht "oder so ähnlich, und wenn Sie mit einem solchen Slogan beginnen, gibt es keinen Ort, an dem Sie können Es gibt keine Möglichkeit, CVS richtig zu machen. "
Aaron Digulla

3
ja. Ich würde zustimmen. Um dieses Problem zu lösen, habe ich das Repo mit svn-git ausgecheckt und mit git den Zweig auf den Master zurückgesetzt.
Edward Anderson

66

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

Ich weiß, dass andere hier denken, dass es ungewöhnlich ist, aber ich mache es gerne so. Wenn ich einen Feature-Zweig habe und bereit bin, ihn mit einem Trunk zusammenzuführen, der ebenfalls erheblich geändert wurde, werde ich ihn mit einem neuen Zweig zusammenführen, der normalerweise den Namen hat <FeatureBranchName>-Merged. Dann löse ich Konflikte und teste den zusammengeführten Code. Sobald dies abgeschlossen ist, verschiebe ich den Trunk in den Tags-Ordner, damit ich nichts verliere. Zuletzt bewege ich meine <FeatureBranchName>-Mergedzum Kofferraum.

Außerdem ziehe ich es vor, die Arbeitskopie beim Verschieben zu vermeiden. Hier sind Beispiele für die 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

Hinweis: Ich benutze 1.5


1
Das ist vielleicht nicht die beste Vorgehensweise, aber es ist sicherlich die effizienteste, wenn Sie einen sehr alten Stamm haben und alle an einem Zweig gearbeitet haben, als wäre es der Stamm. Es hat mein Problem gelöst!
Alex Perrin

12

Ich habe mir dieses Problem erst kürzlich angesehen und die Lösung, mit der ich sehr zufrieden war, war die Leistung

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

auf der Arbeitskopie meines Kofferraums.

Dies versucht nicht, Änderungen auf historische Weise anzuwenden (Änderungen im Trunk beizubehalten). Es "wendet einfach den Unterschied an" zwischen dem Stamm und dem Zweig. Dies führt zu keinen Konflikten für Ihre Benutzer in den Dateien, die nicht geändert wurden. Sie verlieren jedoch Ihre historischen Informationen aus dem Zweig, aber das passiert, wenn Sie trotzdem eine Zusammenführung durchführen.


1
Nach SVN 1.5 sollten Sie in der Lage sein, Zusammenführungen durchzuführen, die den Verlauf bewahren.
NSherwin

9

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 hervorragende 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.


Ein Link zu Repo wäre praktisch (nur zur Vereinfachung - speichern Sie eine Google-Suche :))
Brian M. Hunt

3
Es tut uns leid. Die Schreibweise ließ es so aussehen, als würde ich mich auf ein bestimmtes Werkzeug beziehen (bearbeitet). Tatsächlich sollten die meisten SVN-GUI-Tools über eine Repository-Browserfunktion verfügen. Zu Ihrer Information: Ich benutze Schildkröte tortoisesvn.tigris.org
Chris Nava

4

Wenn Sie den Zweig zum neuen Trunk machen möchten (dh) alle Änderungen im Trunk entfernen möchten, die seit dem Erstellen des Zweigs vorgenommen wurden, können Sie 1. einen Zweig des Trunks erstellen (zu Sicherungszwecken) 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

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

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

Für ein 1.4-Repository würde ich empfehlen , die Bewegung des vorhandenen Trunks an anderer Stelle zu verwenden svnadmin dumpund svndumpfilterauszuführen und dann den Zweig mit demselben Mechanismus in den Trunk zu verschieben. Laden Sie die beiden Dumpfiles in ein Test-Repository, überprüfen Sie sie und verschieben Sie sie in die Produktion.

Sichern Sie natürlich Ihr vorhandenes Repository, bevor Sie beginnen.

Dies bewahrt den Verlauf, ohne das Verschieben / Kopieren explizit aufzuzeichnen, und erleichtert die zukünftige Neuorganisation, den Erhalt des Verlaufs.


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

Außerdem können kopierte Pfade Probleme verursachen. 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 ausgeschlossenen Speicherort svndumpfilteran einen eingeschlossenen Speicherort kopiert haben . Um die Dump-Daten autark zu machen,svndumpfiltermuss weiterhin das Hinzufügen des neuen Pfads anzeigen - einschließlich des Inhalts aller von der Kopie erstellten Dateien - und darf dieses Hinzufügen nicht als Kopie einer Quelle darstellen, die in Ihrem gefilterten Speicherauszugsdatenstrom nicht vorhanden ist. Da das Subversion-Repository-Dump-Format jedoch nur anzeigt, was in jeder Revision geändert wurde, ist der Inhalt der Kopierquelle möglicherweise nicht ohne weiteres verfügbar. Wenn Sie den Verdacht haben, dass Sie Kopien dieser Art in Ihrem Repository haben, sollten Sie Ihre Gruppe eingeschlossener / ausgeschlossener Pfade überdenken, möglicherweise auch die Pfade, die als Ursachen für Ihre problematischen 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 und durch die einfache Verwendung svndumpfilterfür zukünftige Migrationen / Reorganisationen das Risiko bei relativ geringen Kosten verringert wird.


Warum sollte "svn move" nicht ausreichen? Ihr Vorschlag scheint, als würde man eine Fliege mit einem Vorschlaghammer zerquetschen.
Rob Williams

Dieses 1.4-Verhalten hat mich gebissen. Wenn ein SVN-Repository Verschiebungen (Umbenennungen) von Verzeichnissen oder Zweigen / Tags enthält, kann die Verwendung von svndumpfilter zur Reorganisation / Migration eines Repositorys in eine neue Struktur fehlschlagen, da es den Verlauf nicht verarbeitet Gut. Es ist dokumentiert, ich werde den Schiedsrichter ausgraben. wenn Sie möchten
Ken Gentle

Könnten Sie den Verweis auf dieses Verhalten hinzufügen?
Jacco

2

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

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 .


Vielen Dank für die offiziellen Informationen, damit ich den Zweig durch den offiziellen Ansatz mit dem Stamm zusammenführen kann. Das Schlüsselwort ist wieder integriert
Junyo

-3

Es ist eine wirklich seltsame / ungewöhnliche Konfiguration in SVN, auch wenn ich denke, dass es überhaupt keine "gute Praxis" ist. Ich denke, Sie könnten so etwas tun:

  • Kasse alle Quellen (svn co therootsourcetree)
  • Entfernen Sie den Kofferraum (svn rm Kofferraum)
  • Kopieren Sie den Zweig in den Trunk (svn cp branch / thebranch / trunk)
  • Entfernen Sie den Zweig (svn rm Zweige / thebranch)
  • Übernehmen Sie die Änderungen

Viel Glück


9
Dies zerstört die Spur der Geschichte, die durch "svn move" erhalten bleiben würde.
Rob Williams
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.