Feature Branches mit Tortoise-SVN 1.6
Über die graphische Benutzeroberfläche von Tortoise lassen sich relativ einfach feature branches erstellen und verwalten.
Die Definition eines feature branch:
“It’s a temporary branch created to work on a complex change without interfering with the stability of /trunk. Unlike release branches (which may need to be supported forever), feature branches are born, used for a while, merged back to the trunk, then ultimately deleted. They have a finite span of usefulness.” (Quelle: http://svnbook.red-bean.com/en/1.1/svn-book.html)Im Folgenden werde ich auf zwei Möglichkeiten eingehen, um solche branches mit Tortoise zu erstellen, wobei die zweite Variante einen Subversion-Server auf Version 1.5 vorraussetzt.
Verzeichnisstruktur:
Die Struktur des Beispiel-Projektes ist folgendermassen aufgebaut:
antlr-demo + branches + tags + trunk + src
Wichtiger Hinweis
Vor dem branchen sollten keine lokalen Änderungen in der working copy vorliegen. Dadurch kann bei einem Merge-Fehler mit Hilfe des Befehls “revert” jederzeit ein gültiger Stand wiederhergestellt werden.
Tortoise 1.6 mit Subversion Server < 1.5
branching / tagging
Im Explorer mit Rechtsklick auf das Verzeichniss trunk und den Befehl “Branch/Tag…” auswählen.
Dies erstellt einen branch mit der HEAD revision vom trunk Inhalt in das Verzeichniss “…/branches/antlr-demo-1.0.1”.
Solche Kopien sind nicht “teuer”, da SVN die Dateien nicht einfach im Repository dupliziert, sondern lediglich ein link auf den neu erstellten Ordner setzt. Werden nun Dateien geändert und in den branch commited, so werden nur diese Dateien neu erstellt. Dies hat eine deutliche Speicherentlastung des Repositories zur Folge.
Nach der Fertigstellung eines features sollen die Änderungen zurück in den trunk einfliessen.
merging ohne merge-tracking
Rechte Maustaste auf trunk und Befehl “Merge…” wählen. Als “Merge type” wählt man “Merge a range of revisions”.
Nun ist wichtig, dass man das Feld “Revision rang to merge” nicht einfach leer lässt, sondern im Dialog “Show log” implizit angibt welche revisions in den trunk gemerget werden sollen.
Am besten setzt man den Filter “Stop on copy/rename”. Hiermit werden nur die relevanten Änderungen in diesem branch angezeigt. Danach kann man das merging starten. SVN bietet zudem noch die Möglichkeit vorher einen test-branch durchzuführen.
Diese Methodik hat den Vorteil, dass genau konfiguriert werden kann, welche Änderungen in den trunk einfliessen sollen. Als Nachteil ist sicherlich die manuelle Interaktion beim Auswählen der revisions und somit die höhere Fehleranfälligkeit zu erwähnen.
Tortoise 1.6 mit Subversion Server >= 1.5
merging mit merge-tracking
Mit Subversion Version 1.5 wurde das feature “merge-tracking” eingeführt. Durch implizites Setzen des “mergeinfo” property kann SVN selbst feststellen, welche revisions für den merge benötigt werden. Im folgenden Beispiel gehen ich davon aus, dass der branch wie in der oben beschriebenen Möglichkeit erstellt wurde.
Rechte Maustaste auf das Verzeichniss trunk und den Befehl “Merge…” auswählen. Als “Merge type” wählt man “Reintegrate a branch”.
Nun kann man den zu integrierenden branch angeben und mergen. Mit dieser Methode ist es nicht erforderlich die revisions manuell zu setzen. SVN merkt sich durch das property “mergeinfo” welche revision bereits integriert wurden und führt diese nach jedem branch entsprechend nach.
Diese Variante ist weniger Fehleranfällig wie letztere, allerdings auch weniger flexibel, da immer die gesamten Änderungen im brach integriert werden.
happy merging! 🙂
Weiterführende Links
- http://www.javaworld.com/javaworld/jw-01-2008/jw-01-svnmerging.html
- http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.branchmerge
- http://tortoisesvn.net/docs/release/TortoiseSVN_en/help-onepage.html