2010-08-20 3 views

Antwort

35

Mit Subversion 1.5 oder höher wird die Zusammenführung auf Ihrer lokalen Arbeitskopie in der svn: mergeinfo Eigenschaft aufgezeichnet. Diese Information ist also nicht verloren.

Sie können die fusionierten Revisionen anzeigen, wenn Sie svn log -g statt der normalen svn log verwenden.

Normale Merges werden durchgeführt, wie

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

Aber wenn Sie einen Zweig verwenden ist es manchmal bequemer, ein Reintegrationsdruck zu verwenden. In diesem Fall sollten Sie zuerst alle Änderungen vom Stamm auf den Zweig verschmelzen mit so etwas wie

svn merge svn://server/trunk my_branch_wc 

(Diese verschmilzt alles, was nicht bereits verschmolzen ist)

Und nachdem Sie diese Änderung auf den Zweig begehen können Sie

verwenden
svn merge --reintegrate svn://server/branch my_trunk_wc 

Um alle Änderungen als ein einziges Commit zu verschieben. (Nach dieser Operation sollten Sie den Zweig entfernen)

+0

_ "nach dieser Operation sollten Sie den Zweig" _ entfernen. Warum sollte es nicht einfach "entfernen" sein? Ich mag es, die ganze Geschichte so lange herumzutragen, wie es keine Probleme verursacht. – Zitrax

+1

Die Geschichte ist immer noch in der alten Version, wie Sie sehen können, wenn Sie 'svn log -g' ausführen. Aber Sie sollten die Filiale nicht mehr nutzen, da sie ohne weitere Buchhaltung nicht wieder zusammengeführt werden kann. (Beachten Sie, dass viel neuere Subversion-Versionen (1.8+) die Anforderung --integrate fallengelassen haben und die Verzweigung sogar wieder mit der richtigen Zusammenführung aus dem Trunk nutzbar machen können) –

+0

@BertHuijben: Hallo Sir, können Sie sich bitte meine Frage hier ansehen ] (http://stackoverflow.com/q/36157555/3287204)? Vielen Dank im Voraus ... :) –

1

Sie können jeden Änderungssatz als Diff speichern und dann jeweils auf den Stamm übertragen. Dies wird allgemein als "Verpflanzen" bezeichnet, und es gibt verschiedene Tools, um dies automatisch zu tun.

+2

Irgendein Beispiel für diese Tools? – turbanoff

5

Ich bin ein bisschen eingerostet, aber sollte das nicht der Trick sein?

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

See:

svn merge --help 
+1

es wird nur in Ihre Arbeitskopie verschmelzen, die Sie dann commit - aber die Trunk-Geschichte wird nur dieses Commit erinnern - ohne die aus dem Zweig –

+0

Ich denke, du hast Recht ... Ich war mit "kopieren" zu verwirren was die Geschichte bewahrt. – DarkDust

+2

Ist das nicht, wofür 'svn: mergeinfo' ist? – detly

0

Es klingt wie Sie wollen:

  1. Merge von möglicherweise mehreren Zweigen.
  2. Lassen Sie alle Zusammenführungen ordnungsgemäß als solche aufgezeichnet werden.
  3. Nur als eine neue Revision festschreiben.

Ich denke, das wird von der zugrunde liegenden SVN-Architektur unterstützt. Aber ich weiß nicht, ob es irgendwelche Clients gibt, die es bereitstellen (obwohl svnmucc für mehrere cp, mv, rm Befehle es tun wird). Es sei denn, du willst mehr forschen als ich (was nicht viel kosten würde), oder schreibe deinen eigenen Client, der die SVN-Bibliotheken dazu bringen kann (was zwar schwer, aber immer noch machbar ist); dann denke ich, dass du eins von 2. und 3. oben opfern musst.

(Wenn Sie 3 opfern, könnten Sie das Repository direkt danach ablegen und die Dump-Datei hacken, um nur eine Revision zu verwenden, aber ich denke nicht, dass es das Risiko wert ist, einen einfacheren Revisionshistory zu haben ...)

1

Um eine Zusammenführung von einem Zweig zu erstellen, und erstellen Sie ein einzelnes Commit für jeden in der Branche verpflichten Sie ein Skript verwenden können, ich bin mit dem folgenden:

#/bin/bash 

BRANCH="http://your branch url" 

for i in {1127..1138} # list of revisions 
do 
    REV=$i 
    echo $REV $BRANCH 
    echo merged $REV from $BRANCH > tmps.commit 
    svn log -c $REV $BRANCH >> tmps.commit 
    svn up 
    svn merge -c $REV $BRANCH ./ 
    svn commit -F tmps.commit 
    rm tmps.commit 
done 

Dadurch wird jede Revision, die Sie für den spezifischen Zweig angeben, ausgecheckt und ein Commit für das aktuelle Verzeichnis durchgeführt, wodurch jede einzelne Änderung mit der entsprechenden Nachricht beibehalten wird.

+0

Ich habe gerade dieses Skript erfolgreich verwendet und es funktioniert gut. Die einzige Überlegung ist, dass dieses Skript, wenn es alle Revisionsnummern von X bis N durchläuft, keine rein fortlaufenden Nummern sind, sondern wir können die Revision 1131 haben, gefolgt von der Revision 1135. In diesem Fall werden wir einen leeren Revisions-Commit in den neuen Zweig einfügen, um einen Commit ohne Änderungen zu erstellen. Ich kann dieses Skript das nächste Mal ändern, um zu überprüfen, ob tmps.commit leer ist, und wenn ja, fahre fort, um diese zusätzlichen Änderungen zu vermeiden. Da SVN kein Commit ohne Kommentar erlaubt, sollte dies wie erwartet funktionieren. – jcpennypincher

Verwandte Themen