Předmluva

Tato kniha se nesnaží být překladem SVN book i když z ní samozřejmě vychází. Motivací pro mě byli jak vlastní začátky se Subversion, tak pozdější zavádění Subversion ve větším měřítku. Dnes si práci bez Subversion nedovedu představit a kvalitní česká kniha zaměřená převáně na uživatele neexistuje. Snad tato kniha přinese ještě větší rozšíření Subversion.

Pokud kniha obsahuje nějaké skripty tak jsou buď psané ve Windows Vista nebo na Linuxu kde používám distribuci Ubuntu.

Pokud budete mít jakekoliv připomínky, náměty nebo byste se chtěli podílet na rozrůstání obsahu knihy, obraťte se na mě nejlepe na email <ladislav@prskavec.net> a do předmětu uveďte "SVN kniha".

O knize

Licence

Tento dokument je určen výhradně pro osobní potřebu seznámení se systémem Subversion. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií apod. je výslovně zakázáno a bude považováno za porušení autorských práv.

Úvod

Co je to Subversion?

Zcela vlastními slovy bych pro znalé řekl, že je to nástroj, který nahradil CVS. Pro ty, kterým tato věta nic neříká je určen další odstavec.

Subversion je nástroj ze skupiny SCM (správa obsahu zrojových kódů - Source Content Management). Nejvíce rozšířený nástroj v minulých letech a částečně i dnes je CVS, který má několik zásadních nevýhod, které donutili CollabNet k tomu, aby se vrhli do vývoje Subversion.

Subversion slouží ke zprávě zdrojových kódů, které jsou napsány v jakémkoliv jazyce jak programovacím tak lidském. Nativně podporuje kódování UTF-8 a proto není problém psát dokumenty anglicky, rusky nebo svahilsky. SVN uchovává vytváři revize, to znamená, že uchovává stav dokumentů z doby, kdy jste dali vykonat příkaz commit, který slouží k odeslání zdrojových dat na server. Můžete si pomocí Subversion spravovat verze textového dokumentu jako je například tato kniha psaná v Docbooku a nebo zdrojové kódy v libovolném programovacím jazyce (třeba i vlastním).

Subversion patří k cetralizovaným SCM systémům jako je CVS, Perforce, Clearcase a další. Existují také distribuované SCM systémy, které nemají klasickou architekturu client/server. Například Bazaar, Mercurial nebo Git. Porovnání a odkazy na jiné SCM najdete na stránkách Better SCM

Historie Subversion

Subversion vznikl officiálně 31. srpna 2001 a verze 1.0 byla k dispozici v roce 2004.

1.1 září 2004 (FSFS)

1.2 květen 2005 (locks)

1.3 prosinec 2005 (svnserve)

1.4 září 2006 (svnsync)

1.5 červen 2008 (merge tracking support)

1.6 březen 2009

Vývoj Subversion neustále pokračuje a přibližuje se jeho kvalita komerčním systémům jako je Perforce nebo Clearcase. V opensource komunitě, ale začíná také získávat popularitu Git, který je narozdíl od Subversion distribuovaný. Git je například používán v komunitě OpenSUSE nebo při vývoji jádra Linuxu.

Jak funguje Subversion

Architekturu subeversion nejlépe znázorňuje obrázek v [SVNBOOK] na straně 22.

SVN architektura

Základní pojmy

Repository (repozitář, centrální úložiště)

Umožňuje organizovat projekt a spravovat jeho verze. Fyzicky je uloženo na souborovém systému serveru. K repository se přistupuje přes Repository Access Layer (RA) systému Subversion a jeho správa se provádí klientskými nástroji.

Branch (větev)

Slouží k organizaci repository, jedná se o jakousi analogii s adresáři. Pokud se z repository vyzvedne větev, na klientovi vznikne adresářová struktura, která přesně odpovídá větvím v repository.

Revision (revize)

Revize je pořadové číslo každé změny. Slouží ke sledování změn ve větvích v čase. Každá změna v nějaké větvi vytvoří novou revizi v rámci celé repository. Revize obsahuje informace o tom, co bylo změněno, kdo změnu provedl, poznámku a čas.

Pracovní kopie (working copy)

Kopie dat z určité větve z repository v aktuální revizi na pevný disk lokálního klienta. Do pracovní kopie je možné provádět změny, které je možné commitem uložit zpět do repository.

Commit

Odeslání změn provedených od posledního commitu do repository. Commit je nejčastěji používaná změna při práci s repository. Pokud se provádí commit celé pracovní kopie, jedná se o atomickou operaci, jsou odeslány veškeré změny ve všech objektech ve správě verzí; pokud dojde k nějaké chybě při přenosu, není commit pro ostatní uživatele repository zviditelněn, není vytvořena nová revize.

Konflikt

Konflikt je stav, který signalizuje, že stejný objekt, který má být právě commitován, byl změněn někým jiným a nachází se v repository v aktuální revizi v jiné podobě, než jaký je v pracovní kopii. Nelze provést commit celé pracovní kopie, pokud se v ní nachází jeden nebo více souboru v konfliktu.

Cheap-copy

Technika, kterou se realizují kopie prováděné v rámci repository. Objekty nejsou v repository fyzicky duplikovány, ale jsou vytvořeny tzv. odkazy (link) na kopírované objekty. Zjednodušeně lze chápat takovýto link jako informaci o URL s číslem revize. Díky tomu má SVN nízké nároky na datový prostor.

Doporučená struktura repozitory

Stukturu repozitory lze jen doporučit, obvyklá struktura je:

/project_name
     /trunk
     /tags
     /branches

Sturuktura může samozřejmě obsahovat i další adresáře např. vendors pro kód, třetí strany nezbytný k projektu. Existují samozřejmě další možnosti v literatuře se uvádí např.

/trunk
  /project_1
  /project_2
/tags
  /project_1
  /project_2
/branches
  /project_1
  /project_2

Instalace

Získáme Subversion

Subversion je k dispozici ve formě zdrojových kódů nebo ve formě binárních balíčků pro různé operační systémy. Subversion je dostupný pro Windows, Mac OS, různé distribuce linuxu i pro některé unixy. Veškerý potřebný software stáhnete na stránkách http://subversion.apache.org

Windows

Ve Windows je několik programů, které si můžete pro práci zvolit a to buď klasického řádkového klienta a server s podporou svnserve. Nebo jako klienta použijete TortoiseSVN (TSVN), který umožňuje běh jako klient i server (s omezením na lokální přístup k repozitory). Pokud chcete přistupovat přes http a https doporučil bych k instalaci VisualSVN Server.

Pokud nepotřebujete, aby někdo přistupoval k vašim lokálním repozitory doporučuji TSVN. Tento program umí všechny funkce a má pěkné prostředí, které se integruje do Windows Exploreru. Je nejpokročilejší klient, který umožňuje i tvorbu hooks skriptů na straně klienta.

VisualSVN server

VisualSVN je jen Apache server s mod_dav_svn doplňený administrační konzolí a webovým prohlížečem repozitory.

Instalace je VisualSVN serveru je jednoduchá. Stáhněte si instalátor, který vás pomocí wizarda provede. Můžete navolit kam se server nainstaluje i kde máte adresář s repozitory. Můžete také použít kromě Subversion autentifikace i Windows autentifikaci. Volitelné je i https připojení.

VisualSVN server instalace

Nastavení práv pro jednotlivé repozitory se dá provést pomocí admnistrační konzole. VisualSVN také disponuje webovým prohlížečem repozitory, který je dostupný na adrese https://localhost:8443/ pokud to máte v základním nastavení lokálně, jinak na příslušné adrese a portu.

Pro nastavení práv služí VisualSVN Server Manager, kde máte vidět jak repozitory, tak uživatele a skupiny. Potom přes pravé tlačítko a volbu Security nastavíte práva buď pro všechna repozitory najednou nebo u každého zvlášť.

VisualSVN server manager

Linux - Debian / Ubuntu

Pro instalaci na Ubuntu použijte zdroje přímo z repozitory.

sudo apt-get install subversion
sudo apt-get install subversion-tools

Balík subversion obsahuje jak klienta tak server (svnserv). V balíku subversion-tools jsou utility (svn-backup-dumps, svn-clean, svn2cl, mailer apod.)

Já používán svn2cl pro generování changelogů, mailer používám v post-commitech, abych věděl co se děje v repozitářích.

Pro přístup lze použít file://, svn:// nebo svn+ssh://. Pokud chcete použít http:// nebo https:// musíte to udělat přes Apache a WebDAV.

sudo apt-get install libapache2-svn

Konfigurace se potom provede v /etc/apache2/mods-available/dav_svn.conf. Ukázka je s přepínačem SVNListParentPath, kdy nám dovolí přístup ke všem repozitory, které máme v adresáři /srv/svn.

<Location /svn/>
  DAV svn
  SVNPath /srv/svn
  SVNListParentPath On
  AuthType Basic
  AuthName "Test subversion repository"
  AuthUserFile /etc/subversion/passwd
  Require valid-user
</Location>

Podrobný návod pro Ubuntu najdete například ve wiki.

Začínáme

TortoiseSVN

Vytváříme repozitory

Vytvoříme adresář pro repozitory např. c:/rep a v něm adresář pro projekt např. rep_test a na adresáři přes pravé tlačítko se dostaneme do menu TSVN, kde před volbu Vytvořit repozitory zde (Create repozitory here) vytvoříme repozitory jak ukazuje obrázek. Po úspěšném vytvoření repozitory si můžeme prohlédnout adresář a uvidíme soubory co vytvořil Subversion.

Vytváříte repozitory

Struktura repozitory je na dalším výpisu. V adresáři conf/ jsou konfigurační soubory pro přístup k repozitory, v adresáři db/ jsou uložená data a souboru current je aktuální revize. V adresáři hooks/ jsou šablony pro hooks skripty, které umožňují vykonat nějakou akci před určitou akcí v Subversion.

conf/
  authz
  passwd
  svnserve.conf
db/
  ..
  current
  ..
hooks/
  post-commit.tmpl
  post-lock.tmpl
  post-revprop-change.tmpl
  post-unlock.tmpl
  pre-commit.tmpl
  pre-lock.tmpl
  pre-revprop-change.tmpl
  pre-unlock.tmpl
  start-commit.tmpl
locks/
format
README.txt

Po vytvoření repozitory je dobré otevřít repozitory browser a vytvořit základní strukturu pomocí přímaku vytvořit adresář "create folder".

Vytváříte adresáře v repozitory

V repozitory můžete vytvořit vlastní adresáře, ale doporučuje se nejdříve vytvořit strukturu do které naimportujete svoje adresáře.

Struktura slouží k tomu, abychom vedli hlavní kmen projektu (trunk) a mohli také vést větve (branches) a dělat nálepky (tags) pro určité vydané verze.

Doporučená struktura

Import zdrojových kódů

Pokud už máme něco co chceme do repozitory importovat uděláme to pomocí příkazu import. Jinak můžeme tento krok přeskočit, protože strukturu můžeme vytvořit pomocí repozitory browseru.

Vytváříme pracovní kopii

Provedeme checkout na repozitory a začneme pracovat.

Checkout

SVN - řádkový klient

Ve stručnosti zopakuji stejné postupy jako ve TSVN.

Vytvoříme repozitory

svnadmin create --fs-type fsfs c:/rep/rep_test

Rozdíl mezi Windows a Linuxem je jen ve způsobu zadávání cesty k repozitory. Obdobně to můžete aplikovat na všechny příklady. SVN se ve funkčnosti mezi Windows a Linuxem nijak neliší.

svnadmin create --fs-type fsfs /srv/svn/rep_test

V řádkovém klientu nemůžeme vytvořit adresáře přímo, ale uděláme je rovnou při prvním importu souborů, tento postup lze použít i přes TSVN.

cd c:/tmp
mkdir test
cd test
mkdir trunk
mkdir tags
mkdir branches
svn import --message "Initial import" file:///C:/rep/rep_test

Potom vytvoříme pracovní kopii

svn checkout file:///C:/rep/rep_test/trunk c:/wc/test

Běžný pracovní postup

Nejdříve si aktualizujte svoji pracovní kopii.

svn update

nebo

svn up

Skoro každý příkaz má zkratku, která se hodí aby jste to nemuseli rozepisovat. Stačí se podívat na svn help a uvidíte je.

Potom vytvoříte nové soubory, smažete staré soubory, změníte obsah. Pomocí příkazu svn diff si ověříte můžete zobrazit změny své pracovní kopie proti verzi v repozitory.

svn diff

Pokud jste pracovali s pracovní kopii a přidávali nebo mazali soubory, je dobré vědět zda jsou již přidané či v jakém stavu jsou to zjistíme pomocí svn status a potom můžeme chybějící soubory např. pomocí svn add přidat.

svn status

Změny odešlete je pomocí commitu do repozitory.

svn commit -m "Text zprávy"

Postup se opakuje, jen update nemusíte dávat pokaždé pokud jste si jistý, že nikdo s repozitory mezitím nepracoval. Případně můžete zamknout repozitory během práce na změnách. Pokud nenastane konflikt vystačíte si s tímto jednoduchým postupem. Pokud dojde ke konfliktu můžete změny spojit (merge) nebo svoje vrátit pomocí svn revert.

Export pro hosting, ftp apod.

Pokud by vám vadí adresáře, které svn vytváří automaticky a uchovává v nich svoje informace, tak těch se zbavíte pomocí exportu.

Pokud chcete do aktuálního adresáře všechny soubory vyexportovat stačí zadat tento příkaz a soubory se tam uloží. Dá se také pracovat s pracovní kopii nebo zadávat i cestu pro export.

svn export file:///C:/rep/rep_test/trunk

Příklad exportního skriptu v shellu linux pro export projektu. Exportuje se poslední revize, a vytvoří se kromě exportu i balík označený revizí a datumem vytvoření.

# path to export files
EXPORTPATH=/home/user/export/projekt
# url of repository
REPOS=file:///home/user/repos/projekt/trunk/
# path to repository
REPOSPATH=/home/user/repos/projekt/
# last revision
REV="$( svnlook youngest $REPOSPATH )"
# make export path
mkdir -p $EXPORTPATH
# svn force export (nothing to screen)
svn export --force $REPOS $EXPORTPATH  >> /dev/null
cd $EXPORTPATH
cd ..
# make tar.gz file for projekt
tar -czvf projekt-R$REV-`date +%Y%m%d-%H%M%S`.tgz projekt >> /dev/null

Pokud budete chtít vyexportovat jen soubory co se změnili v poslední revizi bude to trochu složitější a budete potřebovat tento skript.

# path to export files
EXPORTPATH=/tmp/test/
       # url of repository
REPOS=file:///home/user/repos/projekt/
       # path to repository
REPOSPATH=/home/user/repos/projekt/
# last revision
REV="$( svnlook youngest $REPOSPATH )"

# function to list and export file by file
pathexport() # $1
{
mkdir -p $EXPORTPATH${2%/*}
svn export --force $1$2 $EXPORTPATH$2
}

# make export path
mkdir -p $EXPORTPATH
# list all changed files
for i in $( svnlook changed -r $REV $REPOSPATH ); do
  if [ "${#i}" -gt "2" ]
      then pathexport $REPOS $i
  fi
done

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.

Integrace SVN s editory a IDE

Eclipse

Eclipse má nativně podporu jen pro CVS, pro Subversion musíte nainstalovat plugin Subclipse nebo Subversive, který používá například Zend Studio for Eclipse

Po delší zkušenosti s Zend Studiem doporučuji všem spíše Subversive.

Eclipse PDT s Subclipse

Microsoft Visual Studio

Pro práci se Subversion budete potřebovat AnkhSVN 2.0 nebo VisualSVN

MS Visual Studio s VisualSVN

NetBeans, Komodo IDE, SciTE a další

SVN řádkový klient se používá v mnoha editorech i v IDE. Jako ukázku tu mám obrázek z NetBeans, které poskytují celkem pěkný komfort a využívají jen řádkového klienta což přinese výhodu např. při vydání nové verze Subversion, stačí aktualizovat SVN klienta a nemusíte shánět podporu pro svoje IDE.

NetBeans

Komodo IDE patří ke komerčním editorům, který podporuje mnoho jazyků (PHP, Perl, Python, Ruby, Tcl, Javascript, Actionscript) a ze SCM podporuje kromě Subversion, Perforce a CVS.

KomodoIDE

JetBrains (RubyMine, PHPStorm, IntelliJ IDEA)

JetBrains mají velmi kvalitní IDE pro Javu, PHP, Ruby a další, kde je vestavěná podpora pro SVN, Git a další VCS.

Distribuované systémy pro správu verzí

Přechod od Subversion k Mercurial

Mercurial (hg) je další distribuovaný systém, který je napsaný v pythonu a podporuje ho například google ve svém code.google.com a také existuje hosting bitbucket.org, který umožňuje zdarma hosting open source projektů jako code.google.com nebo github.com pro git. Služby github.com a bitbucket.org mají také své placené varianty pro komerční využití.

Keywords v hg normálně nejsou, řeší se to přes standardní doplněk, který je potřeba zaplnout a nastavit v konfiguračním souboru .hgrc.

[extensions]
hgext.keyword =
keyword=/usr/share/python-support/mercurial-common/hgext/keyword.py
[keyword]
**.php =
**.xml =
[keywordmaps]
RCSFile = {file|basename},v
Author = {author|user}
Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
Source = {root}/{file},v
Date = {date|utcdate}
Id = {file|basename},v {node|short} {date|utcdate} {author|user}
Revision = {node|short}

Export - obdoba svn export je v hg příkaz archive, který ale umožňuje také vytvořit ze souborů přímo archív (zip, tar, tgz, tbz2).

hg archive path/to/dir/
hg archive -t zip /path/to/file.zip

Log v xml formátu kompatibilním se svn log --xml. Pro logování jsem vytvořil script, který umí to co standardní parametr xml v SVN. Parametrem scriptu je výstupní soubor.

# http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html
echo '<?xml version="1.0"?>\n<log>\n' >$1.xml
hg log --template '<logentry revision="{rev}">
<author>{author|obfuscate}</author>
<date>{date|isodate}</date>
<msg>{desc|escape}\n</msg>
<paths><path>{files}</path></paths>
</logentry>\n' $1/ >>$1.xml
echo '</log>\n' >>$1.xml

Spolupráce distribuovaných systému se Subversion

Některé distribuované systémy (git, bazaar a jistě další) mají utility, které umožnují, že lokálně pracujete jako s distribuovaným systémem, ale push provádíte do SVN repozitory.

Ukázka postupu v gitu (git-svn)

git svn clone file:///srv/svn/repos/test
...
nějaké změny
...
git commit -a
git svn dcommit

Ukázka postupu v bazaar (bzr)

bzr checkout file:///srv/svn/repos/test
bzr unbind
...
nějaké změny
...
bzr commit
bzr bind
bzr push file:///home/svn/repos/test

Tento postup lze zkrátit pomocí bzr commit --local potom nemusíme použít bind a unbind.

Nástroje pro práci se Subversion

Commit Monitor

Program Commit Monitor pro Windows umožňuje sledovat změny v repozitory, které si do něj zadáte a upozorní vás pokud někdo provede commit. Autorem je Stefan Küng (http://tools.tortoisesvn.net/). Podobný program je ještě například SVN Notifier.

Commit Monitor 1.2

Bohužel neznám podobnou aplikaci pro Linux, obvykle se to nahrazuje mailovou konferencí kam chodí automaticky všechny commity pro projekt.

Existují webové nástroje, které podobné informace poskytují o projektech. Google Code a Github například poskytuje RSS o změnách. Podobně třeba Trac nebo jiné systémy, které mají podporu pro SVN.

Případně si to můžete udělat sami, jako například já v PHP.

StatSVN

StatSVN je program napsaný v Javě a slouží k analýze logů. Stánout si ho můžete na http://sourceforge.net/projects/statsvn/.

Použití je potom jednoduché jako první parametr dáte log v xml formátu a jako druhý cestu k aktuální pracovní kopii a potom výstupní adresář pro generované html soubory.

java -jar statsvn.jar  c:\rep\test\test_changelog.xml  \
c:\rep\test\ -output-dir c:\tmp\test

Výstup potom vypadá jako na obrázku. Tento program je zdarma, ale umí většinu statických věcí podobně jako profesionální programy pro práci s repozitory jako je FishEYE i když není zdaleka tak v líbivém kabátě.

StatSVN

Generování changelogu pomocí svn2cl

Subversion utilita svn2cl je běžně dostupná v balíku subversion-tools v Debianu/Ubuntu.

Například pro generování changelogu pro tuto knihu se dělal takto:

/usr/bin/svn2cl --strip-prefix=trunk \
        --break-before-msg=2 \
        --group-by-day \
        --separate-daylogs \
        -i \
        --authors=authors.xml \
        file://localhost/svn/svn-kniha/trunk/ \
        -o changelog.html \
        --html

Soubor authors.xml obsahuje toto:

<?xml version="1.0" encoding="utf-8"?>
    <authors>
        <author uid="abtris"> Ladislav Prskavec &lt;ladislav@prskavec.net&gt;
    </author>
</authors>

Výsledek v textové podobě vypadá nějak takto:

2009-06-17  Ladislav Prskavec <ladislav@prskavec.net>

* [r35] changelog, changelog.html, html/apa.html, html/bi01.html,
  html/ch01.html, html/ch01s02.html, html/ch02.html,
  html/ch02s02.html, html/ch02s03.html, html/ch02s04.html,
  html/ch02s05.html, html/ch03.html, html/ch03s02.html,
  html/ch03s03.html, html/ch04.html, html/ch04s02.html,
  html/ch04s03.html, html/ch04s04.html, html/ch05.html,
  html/ch05s02.html, html/ch05s03.html, html/ch05s04.html,
  html/ch05s05.html, html/ch06.html, html/ch06s02.html,
  html/ch06s03.html, html/ch07.html, html/ch07s02.html,
  html/index.html, html/pr01.html, index.html, make.sh,
  svn-kniha.html, svn-kniha.xml, svn2html.css:

  Update generating.
  Link to changelog.

* [r34] authors.xml, changelog, html/apa.html, html/bi01.html,
  html/ch01.html, html/ch01s02.html, html/ch02.html,
  html/ch02s02.html, html/ch02s03.html, html/ch02s04.html,
  html/ch02s05.html, html/ch03.html, html/ch03s02.html,
  html/ch03s03.html, html/ch04.html, html/ch04s02.html,
  html/ch04s03.html, html/ch04s04.html, html/ch05.html,
  html/ch05s02.html, html/ch05s03.html, html/ch05s04.html,
  html/ch05s05.html, html/ch06.html, html/ch06s02.html,
  html/ch06s03.html, html/ch07.html, html/ch07s02.html,
  html/index.html, html/pr01.html, make.sh, svn-kniha.html:

  Update generating, add make changelog

   ...

Literatura a použité zdroje

[SVN] Subversion. URL: http://subversion.tigris.org/.

[BZR] Bazaar VCS. URL: http://bazaar-vcs.org/.

[WIKISVN] Wikipedia Subversion. URL: http://cs.wikipedia.org/wiki/Subversion/.

[DB] Docbook. URL: http://www.docbook.cz.

SVN klienti

[TSVN] TortoiseSVN. URL: http://tortoisesvn.tigris.org/.

[SUBCLIPSE] Subclipse. URL: http://subclipse.tigris.org/.

[SUBVERSIVE] Subversive. URL: http://www.eclipse.org/subversive/.

[ANKHSVN] AnkhSVN. URL: http://ankhsvn.open.collab.net/.

[RSVN] RapidSVN. URL: http://rapidsvn.tigris.org/.

[VISUALSVN] VisualSVN : Subversion for Visual Studio. URL: http://www.visualsvn.com/visualsvn/.

SVN servery

[VSVN] VisualSVN server. URL: http://www.visualsvn.com/server/. Programovací prostředí - IDE

[ECLIPSE] Eclipse. URL: http://www.eclipse.org/.

[ZEND] Zend Studio for Eclipse. URL: http://www.zend.com/en/products/studio/.

[NB] NetBeans. URL: http://www.netbeans.org/.

[VS] MS Visual Studio. URL: http://msdn.microsoft.com/cs-cz/vstudio/.

Dokumentace

[SVNBOOK] SVN book. URL: http://svnbook.red-bean.com/.

Používané zkratky a anglické příkazy

DIR - adresář

FILENAME - název souboru

SVN - Subversion

TSVN - TortoiseSVN

REV - revize

ARG - argumenty

NAME - název

VALUE - hodnota

MESSAGE - zpráva

NUM - počet

PATH - cesta k souboru, repozitory, pracovní kopii

WC - pracovní kopie (working copy)

Alias - zkratka