Pokročilejší funkce

Vlastnosti

Vlastnosti (properties) umožňují uchovávat další informace o jednotlivých souborech. Nastavují se automaticky nebo ručně.

Mezi ty automatické patří od verze 1.5 takzvaný "merge tracking". Někteří klienti ho umí používat a zobrazují potom informace o tom kde co bylo spojeno.

Určitě si každý kdo listoval v projektech, které jsou zpracovávány pod Subversion, v hlavičce informace o verzi a autorovy ($Id: svn-kniha.xml 50 2009-07-20 15:25:15Z abtris $). Tato informace je generována automaticky pomocí vlastnosti svn:keywords=Id. Kromě Id může tato vlastnost nabývat více možností a to Author, Date, Revision a HeadURL. Pro verzi dokumentu se ale obvykle používá Id.

TSVN nastavování vlastností

Příklad použití v PHP

<?php
/**
 * Pridani obecne
 * @version SVN: $Id: svn-kniha.xml 50 2009-07-20 15:25:15Z abtris $
 * @package Akce2008
 * @filesource
 */

Vlastnosti projektu

U projektů se dá nastavit například integrace s systémem pro správu chyb (bug, issue tracker) a může být zcela libovolný, klidně jednoduchá aplikace napsaná v PHP nebo i profesionální jako je JIRA.

TSVN nastavování vlastností projektu

Migrace repozitory

Celé repozitory můžete uložit do souboru.

svnadmin dump repository >file

Celý soubor jde stejně dobře nahrát.

svnadmin load repository < file

Ve windows můžete udělat export všech repozitory např. pomocí tohoto skriptu (přepínač –incremental revize jako diff proti předchozí verzi).

dir c:\rep /b /O /AD >dir1.txt

FOR /F %%M IN (dir1.txt) DO ( ECHO %%M svnadmin dump c:/rep/%%M --incremental >%%M.dmp zip -m -9 -g %%M.dmp.zip %%M.dmp )

Mirror repository pomocí svnsync

Pokud potřebujete read-only mirror, např. kvůli veřejné dostupnosti v případě Open Source projektů nebo jako zálohu má SVN od verze 1.4 nástroj svnsync.

V praxi potřebujete nejdříve mirror inicializovat a potom pravidelně spouštět synchronize, nejlépe post-commitem nebo cronem.

Pokud děláte mirror z nějakého staršího svn repozitory (existuje již několik let) tak můžete narazit na několik problémů s kterými poradím co dělat.

Inicializace mirroru

svnsync init file:///srv/svn/rep-mirror  https://svn.firma.cz/svn/rep-zdroj \
--source-username svnuser --source-password svnpass \
--sync-username svnmirroruser --sync-password svnmirrorpass

Vlastní synchronizace

svnsync synchronize file:///srv/svn/rep-mirror \
--source-username svnuser --source-password svnpass \
--sync-username svnmirroruser --sync-password svnmirrorpass

Řešení možných problémů

Příkazy je lepší psát na jeden řádek, ale v linuxu by nemělo vadit ani rozdělení na více. U synchronizace mi to vyhodilo chybu a byl jsem nucen to dát na jeden řádek. Tady to pro přehlednost nechávám.

svnsync: Cannot accept 'svn:log' property because it is not encoded in UTF-8

Tato chyba bývá způsobena špatnými znaky v logu např. češtinou z windows kódování a je potřeba opravit záznam v svn:log.

Oprava log message se provede buď pomocí svn propset -r111 --revprop svn:log -F fixedlogfile nebo svnadmin setlog /srv/svn/rep-zdroj -r 111 fixedlogfile. Pro svn propset musíte mít povolený a nastavený pre-revprop-change hook skript.

svnsync: Cannot accept non-LF line endings in 'svn:log' property

Pokud se vyskytne tato chyba je potřeba upgradovat SVN server na verzi 1.6.3, kde už umí převádět konce řádků automaticky.

Branches a tags - větve a štítky

Tagy slouží pro zachování určité verze repozitory v čase. V angličtině tomu říkají snapshot. Udělá se jednoduše kopie vaší verze kterou chcete označit štítkem.

svn copy file:///C:/rep/rep_test/trunk file:///C:/rep/rep_test/tags/verze-1 \
-m "Verze 1 mého zkušebního projektu."

Tagy nemusí představovat nutně jen kopii v repozitory, ale můžete zachovat i například současnou pracovní kopii (wc). To se hodí pokud je projekt obsáhlý nebo projevuje chyby na které teď nemáte čas, ale chcete se k nim někdy vrátit.

svn copy c:/wc/test file:///C:/rep/rep_test/tags/problematicka-wc \
-m "Kopie mojí wc."

V TSVN je situace jednoduchá tam máte příkaz Branch/tag pomocí kterého vytvoříte příslušný tag nebo branch (větev). Jak je vidět z následujícího obrázku máte k dispozici několik voleb, které vám dávají možnost vytvořit kopii z HEAD (poslední verze v repozitory) nebo s libovolné verze kterou specifikujete číslem revize a nakonec z příslušné pracovní kopie projektu. Dole pak je volba, která umožní vám nejenom udělat kopii, ale také přepnout WC na vámi udělaný branch/tag. To se používá pokud vytváříte branch a chcete v ní pokračovat.

TSVN - tags a branches

Pokud už víte co jsou tagy také vás nepřekvapí, že branches jsou v rámci repozitory jsou to samé jen se s nimi trochu jinak pracuje. Tagy slouží k zaznamenání určité 1 verze, ale branch slouží k tomu aby se dále upravovala, opravovala apod.

Uvedu jeden příklad např. projekt má 2 verze. Na verzi 2.0 se pracuje v /trunk a verze 1.0 je vydána v /tags/v1-0. Teď ale někdo najde ve verzi 1.0 chybu tak se vytvoří branch v /branches/1-0/ a pracuje se na odstranění chyb, udělá se několik commitů, ty se otestují a když je vše v pořádku vydá se verze v tags /tags/v1-1. Nezávisle na tom se pracuje na verzi 2. Možných schémat práce s větvemi je několik, toto byl jen příklad.

Merge v příkladech

Příkaz merge slouží ke spojování zdrojových kódů, v praxi většinou nastávají tyto případy:

  1. Merge změn z nějaké branche do trunku. Pokud jste to opravili na jednom místě takto to přenesete i jinam.

    svn merge --reintegrate file:///C:/rep/rep_test/branches/test
  2. Reverzní merge, návrat ve trunku nebo větvi k předchozí verzi. Vrátíte zpět změny, které jste udělali mezi revizemi HEAD:80.

    svn merge -r HEAD:80 file:///C:/rep/rep_test/trunk
  3. Kompletní merge do pracovní kopie. Pomocí syntaxe URL@REV se dá přímo zadat revize. První URL (levá strana pro porovnání) a druhé URL (pravá strana pro porovnání) a cíl (pracovní kopie).

    svn merge file:///C:/rep/rep_test/branches/test@150 \
      file:///C:/rep/rep_test/branches/jiny-test@212 \
      c:/wc/test

Pokud provádíte merge z příkazové řádky, hodí se také přepínač --dry-run s kterým si merge vyzkoušíte nanečisto. Informace o merge se dá zjistit také pomocí příkazu svn mergeinfo.