25.01.2011

Základní příkazy v subversion (SVN)

Subversion je systém pro správu a verzování zdrojových kódů, náhrada za starší CVS. Snaží se zachovat podobný způsob a novou funkcionalitu v podobně přesunu nebo kopírování adresářů, časově a prostorově náročné větvení, tagování atd.

Subversion (zkráceně SVN) se používá 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 v různých jazycích. SVN uchovává (vytváří) revize, to znamená, že uchovává stav dokumentů z doby, kdy jste dali vykonat příkaz commit (příkaz sslouží k odeslání zdrojových dat na server). Prostřednictvím Subversion lze spravovat libovolné verze textového dokumentu (spravovat lze i binární soubory, ale ne už s takovým komfortem jako textové soubory). Jedná se aplikace pracující na bázi klient-server, v tomto článku se budeme zabývat používáním klientem pro SVN.

Pro základní strukturu SVN se nejčastěji používají složky (trunk, tags, branches)

Struktura:

  • trunk - umísťuje aktuálná vývojová verze
  • tags - umístění jednotlivých verzí (např. v1.0, v1.5,..)
  • braches - jednotlivé vývojové větce vývojáčů (např. pajinek-dev ..)

Prvním příkazem je stáhnutí aktuálního repozitáře jze serveru ako lokální kopii na náš disk.

svn checkout (co) <url adresa repozitáře na serveru>

Pokud se jedná o první nahrávání dat do repozitáře, lze užít funkce

svn import <adresa lokální složky> <url adresa repozitáře serveru>

Každá složka v lokální kopii obsahuje složku .svn, z které klient získává data. Pro získání dat bez této složky je určen příkaz export. Ten vytvoří kopii bez složky .svn. Při přenosu lokální kopie (například při odevzdání práce) není příliš vhodné předávat s dílem i data o vaší SVN kopii.

svn export <cesta pro export> <cesta uložení>

Při práci se soubory nedoporučuji používat klasické příkazy (rm, rmdir, mv,..) ale raději příkazy SVN. Dochází pak ke konfliktům lokální kopie s kopií na serveru.

  • svn copy (cp)
  • svn mkdir
  • svn move (mv, rename, ren)
  • svn delete (del, remove, rm) smazání souboru ze svn i z lokální kopie

Následujícím příkazem pošleme aktuální změny na lokální kopii na server (tedy synchronizujeme naši verzi se server). Parametr "-m" určuje zprávu pro logování a tak můžeme snadno logovat změny poslané na server

svn commit (ci) -m "<Log>"

Příkazem log pak dostaneme výpis logů

svn log

Pro opačnou synchronizaci, kdy aktualizujeme naši kopii a data bereme ze serveru se provádí příkazem

svn update (up)

Informace o rozdílech mezi pracovní kopií a verzí na disku

status (stat, st)

Další příkazy pro práci ze SVN:

  • svn info - informace o dané revisi:
  • svn add - přidání souboru do svn
  • blame (praise, annotate, ann)
  • cat - vypsání daného souboru z repozitáře (obdobné jako cat v bashi)
  • changelist (cl)
  • cleanup
  • diff (di) - vypíše rozdíl mezi lokální kopií a aktulní verzí v repozitáři
  • help (?, h) - vypíše nápovědu
  • list (ls) - seznam souborů, obdobné jako ls v bashi
  • lock
  • switch (sw)
  • unlock

Největší výhodou verzovacích systémů je možnost zpětnému dohledání jednotlivých verzí, popřípadě slučování dvou odlišných vývojových větví. K tomu slouží následující příkazy. Při práci s verzemi často dochází ke kolizím. Jejich řešení však mnohdy bývá netriviální.

  • merge
  • mergeinfo
  • resolve
  • resolved - řešení konfliktů, v případě že dojde ke konfliktu je možné soubor ručně upravit a pak pro akceptování změn použít tento příaz
  • svn revert - navrácení změn v lokální kopii

Následující příkazy slouží k nastavení chování klienta pro jednotlivé složky vaší lokální kopie.

  • propdel (pdel, pd)
  • propedit (pedit, pe)
  • propget (pget, pg)
  • proplist (plist, pl)
  • propset (pset, ps)

V prostředí bashe (konzole) lze snadno pracovat s opracemi SVN.

Následující příkaz smaže všechny problémové soubory z lokálního disku

svn status | grep "\!" | awk '{print $2}' | xargs svn rm

Příkaz přidá všechny soubory, které nejsou v repozitáři a nalézají se pouze na lokálním disku

svn status | grep "\?" | awk '{print $2}' | xargs svn add

Vytvoření nové větve z trunku:

svn copy svn+ssh://host.example.com/repos/project/trunk \
svn+ssh://host.example.com/repos/project/branches/NAME_OF_BRANCH \
 -m "Creating a branch of project"

Přepnutí na vytvořenou větev

svn switch svn+ssh://host.example.com/repos/project/branches/NAME_OF_BRANCH