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.

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 */
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.

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

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.
Příkaz merge slouží ke spojování zdrojových kódů, v praxi většinou nastávají tyto případy:
-
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
-
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
-
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.