Vertakken / labelen

Eén van de mogelijkheden van versiebeheersystemen is het isoleren van wijzigingen in een aparte ontwikkellijn. Zo'n lijn wordt tak (in het Engels branch) genoemd. Takken worden vaak gebruikt om nieuwe functies uit te proberen, zonder dat daarbij de hoofdontwikkeling verstoord wordt met compiler fouten en bugs. Zodra de nieuwe functie stabiel genoeg is, wordt deze ontwikkel tak samengevoegd met de basislijn (in het Engels de trunk genoemd).

Een andere mogelijkheid van versiebeheersystemen is het markeren van bepaalde revisies (bijv. een vrijgegeven versie), zodat op elk gewenst moment een bepaald pakket of een omgeving opnieuw (op) kunt bouwen. Dit proces wordt labelen genoemd (in het Engels tagging).

Subversion heeft geen speciale commando's voor vertakken of labelen, maar gebruikt hiervoor zogenaamde goedkope kopieën. Goedkope kopieën zijn vergelijkbaar met de harde links in Unix, wat inhoud dat er in plaats van een gehele kopie te maken van het archief, er een interne link wordt aangemaakt. Deze link verwijst naar een specifieke boom of revisie. Hierdoor kunnen takken en labels heel snel gemaakt worden en hebben ze bijna geen extra ruimte nodig in het archief.

Aanmaken van Tak of Label

Als je je project met de aanbevolen mapstructuur hebt geïmporteerd, dan is het aanmaken van een tak of label erg eenvoudig:

Afbeelding 4.53. De Tak/Label Dialoog

De Tak/Label Dialoog


Selecteer de map in je werkkopie, waarvan je een tak of label wilt maken. Selecteer vervolgens het commando TortoiseSVNMaak Tak/label....

The default destination URL for the new branch will be the source URL on which your working copy is based. You will need to edit that URL to the new path for your branch/tag. So instead of

http://svn.collab.net/repos/ProjectName/trunk
      

you might now use something like

http://svn.collab.net/repos/ProjectName/tags/Release_1.10
      

If you can't remember the naming convention you used last time, click the button on the right to open the repository browser so you can view the existing repository structure.

intermediate folders

When you specify the target URL, all the folders up to the last one must already exist or you will get an error message. In the above example, the URL http://svn.collab.net/repos/ProjectName/tags/ must exist to create the Release_1.10 tag.

However if you want to create a branch/tag to an URL that has intermediate folders that don't exist yet you can check the option Create intermediate folders at the bottom of the dialog. If that option is activated, all intermediate folders are automatically created.

Note that this option is disabled by default to avoid typos. For example, if you typed the target URL as http://svn.collab.net/repos/ProjectName/Tags/Release_1.10 instead of http://svn.collab.net/repos/ProjectName/tags/Release_1.10, you would get an error with the option disabled, but with the option enabled a folder Tags would be automatically created, and you would end up with a folder Tags and a folder tags.

Nu moet je de bron van de kopie selecteren. Er zijn daarvoor drie mogelijkheden:

HEAD revisie in het archief

De nieuwe tak wordt direct binnen het archief gekopieerd van de HEAD revisie in het archief. Er hoeven geen gegevens verstuurd te worden vanuit je werkkopie. De tak is dan erg snel gemaakt.

Specifieke revisie in het archief

De nieuwe tak wordt direct binnen het archief gekopieerd, maar je kunt een oudere revisie selecteren. Dit is handig als je vergeten bent een label te maken toen je een nieuwe versie vrijgaf vorige week. Als je het revisienummer niet meer weet, klik dan op de knop aan de rechterkant om het revisie logboek te bekijken en te selecteren. Er worden ook hierbij geen gegevens vanuit je werkkopie gehaald en dus is de tak of label erg snel gemaakt.

Werkkopie

De nieuwe tak moet een identieke kopie zijn van je lokale werkkopie. Als je bijvoorbeeld van enkele bestanden een oudere versie naar je werkkopie hebt gehaald, of als je lokale wijzigingen hebt aangebracht, dan worden exact die bestanden die je in je werkkopie hebt in de tak of label meegenomen. Uiteraard heeft een label van deze complexiteit mogelijk het gevolg dat er informatie vanuit je werkkopie naar het archief gestuurd moet worden, mocht de informatie daar nog niet bekend zijn.

Als je wilt dat je werkkopie automatisch overschakelt naar de nieuw aangemaakte tak, gebruik schakel dan de optie Schakel werkkopie naar de nieuwe tak/label in. Voordat je dat doet, moet je er zeker van zijn dat er geen wijzigingen meer in je werkkopie zitten. Als er wijzigingen in zitten, dan worden deze ook meteen samengevoegd in de werkkopie van de tak als je omschakelt.

If your working copy has other projects included with svn:externals properties, those externals will be listed at the bottom of the branch/tag dialog. For each external, the target path and the source URL is shown.

If you want to make sure that the new tag always is in a consistent state, check all the externals to have their revisions pinned. If you don't check the externals and those externals point to a HEAD revision which might change in the future, checking out the new tag will check out that HEAD revision of the external and your tag might not compile anymore. So it's always a good idea to set the externals to an explicit revision when creating a tag.

The externals are automatically pinned to either the current HEAD revision or the working copy BASE revision, depending on the source of the branch/tag:

Tabel 4.1. Pinned Revision

Copy SourcePinned Revision
HEAD revisie in het archiefexternal's repos HEAD revision
Specifieke revisie in het archiefexternal's repos HEAD revision
Werkkopieexternal's WC BASE revision


externals within externals

If a project that is included as an external has itself included externals, then those will not be tagged! Only externals that are direct children can be tagged.

Klik op OK om de nieuwe kopie vast te leggen in het archief. Vergeet niet een logboek boodschap achter te laten. Merk op dat de kopie gemaakt wordt in het archief.

Merk op dat, tenzij je ervoor gekozen hebt je werkkopie om te laten schakelen naar de nieuw aangemaakte tak, het aanmaken van een Tak of Label je werkkopie niet verandert. Ook als je een tak aanmaakt van je werkkopie, dan worden de wijzigingen in de tak vastgelegd, niet in de basislijn. Het is dus mogelijk dat je werkkopie nog steeds als gewijzigd wordt aangemerkt ten opzicht van de basislijn.

Andere maniere om een tak of label aan te maken

Je kunt ook een tak of label maken zonder dat je een werkkopie hebt. Open hiervoor de archief-verkenner. Daar kun je mappen slepen naar een nieuwe locatie. Je moet de Ctrl ingedrukt houden tijdens het slepen om een kopie te maken, anders wordt de map verplaats in plaats van gekopieerd.

Je kunt ook een map verslepen met de rechter muisknop. Zodra je de muisknop loslaat, kun je kiezen of je de map kopiëren of verplaatsen wilt. Uiteraard moet je een map kopiëren als je een tak of label wilt aanmaken, niet verplaatsen.

Yet another way is from the log dialog. You can show the log dialog for e.g. trunk, select a revision (either the HEAD revision at the very top or an earlier revision), right click and choose create branch/tag from revision....

Ophalen of Wisselen...

.. dat is (niet echt) de vraag. Terwijl bij het ophalen alles van de gewenste tak uit het archief naar je werkkopie wordt gehaald, haalt TortoiseSVNWissel... alleen de gewijzigde gegevens op naar je werkkopie. Dat is gunstig voor de belasting van het netwerk en goed voor je geduld. :-)

Er zijn verschillende mogelijkheden om met je nieuw aangemaakte tak of label te gaan werken. Je kunt:

  • TortoiseSVNOphalen gebruiken om een versie kopie te maken in een lege map. Je kunt naar elke gewenste locatie op je harde schijf je gegevens ophalen en je kunt zoveel werkkopieën maken als je wilt.

  • Je huidige werkkopie wisselen/schakelen naar de nieuw in het archief aangemaakt kopie. Selecteer weer de hoogste map van je project en kies TortoiseSVNWissel... vanuit het context menu.

    Voer in het volgende venster de URL in van de tak die je net aangemaakt hebt. Selecteer het HEAD Revisie keuzerondje en klik op OK. Je werkkopie wordt dan gewisseld naar de nieuwe tak/label.

    Wisselen werkt net zoals Verversen in zoverre dat het nooit de lokale wijzigingen negeert. Elke wijziging die je in je werkkopie hebt aangebracht en nog niet het vastgelegd in het archief, zal worden samengevoegd zodra je wisselt. Als je wilt voorkomen dat dit gebeurt, moet je of je wijzigingen vastleggen voordat je wisselt, of je werkkopie terugzetten naar een eerder vastgelegde revisie (meestal de HEAD revisie).

  • Werken aan een basislijn en een tak, zonder dat je een verse werkkopie op moet halen. Je kunt dan met de Windows Verkenner een kopie maken van je basislijn naar een andere map en vervolgens met TortoiseSVNWissel... de werkkopie omschakelen naar de nieuwe tak.

Afbeelding 4.54. De Wissel Dialoog

De Wissel Dialoog


Ondanks dat Subversion geen verschil maakt tussen labels en takken, verschilt de manier waarop ze gebruikt worden iets.

  • Labels worden in principe gemaakt om een momentopname te maken van een project op een bepaald moment. Als gevolg hiervan, worden deze normaal gesproken niet gebruikt voor ontwikkeling. Hiervoor worden takken gebruikt. Daarom adviseren we gebruik te maken van de mapstructuur met de mappen /trunk /branches /tags. Het werken aan een label is geen goed idee, maar omdat er op je lokale bestanden geen schrijf beveiliging zit, zal niets je tegenhouden. Als je echter probeert wijzigingen vast te leggen naar een pad waarin /tags/ voor komt, dan zal TortoiseSVN je wel waarschuwen.

  • Het is soms nodig om extra wijzigingen aan te brengen in vrijgaves die je al gelabeld hebt. De juiste manier is om eerst een nieuwe tak te maken van de label en vervolgens de tak vast te leggen. Voor je wijzigingen door op deze tak en maak dan opnieuw een label aan van deze tak, bijv. Versie_1.0.1.

  • Als je een werkkopie van een tak wijzigt en vastlegt, dan zullen de wijzigingen in de tak worden vastgelegd en niet in de basislijn. Alleen de wijzigingen worden opgeslagen. De rest blijft een goedkope kopie.