Subversion
Stručný návod pro práci se systémem pro správu verzí Subversion
- Domovská stránka projektu SVN.
- Literatura: Version Control with Subversion.
Instalace klienta SVN
Linux
Základní klient (voláme z příkazové řádky jako "svn") pro přístup a využívání služeb SVN je pro distribuce Debian GNU/Linux a Ubuntu obsažen v balíčku subversion.
MS Windows
Základní klient je dostupný zde. Existuje také několik GUI či zásuvných modulů, např. pro Průzkumníka. Společnost tigris.org vyvíjí vlastní GUI s názvem rapidsvn.
Přihlášení, autentifikace
Pro přihlášení do repositáře na Slonovi je třeba nad protokolem svn použít protokol ssh ssh+svn://. Aby nebylo nutné při každém příkazu opakovat autentifikační údaje (uživatel, heslo) je možné využít autentifikace pomoci veřejného klíče.
Autentifikace pomoci veřejného klíče
Autentifikace pomoci veřejného klíče spočívá v několika krocích:
- Vygenerování jednoduchého klíče (dva soubory) RSA na straně Linux serveru:
~$ ssh-keygen -t rsa
Při vygenerování jste dotázáni na název souboru a frázi. Pro následující logování na službu SVN pomoci klíče bez opakovaného zadávaní této fráze je nutné ji nechat prázdnou. Pokud vám bude privátní klíč bez fráze odcizen je to rovno prozrazení přístupového hesla. Po vygenorovaní máte k dispozici dva soubory. Soubor s příponou pub je veřejný klíč, druhý soubor je privátní klíč.
- Umístění (registrace) veřejného klíče na straně serveru:
~$ cat [jmeno_souboru_klice].pub >> /home/[user]/.ssh/authorized_keys
Klient pod MS Windows
- Umístění (registrace) privátního klíče na straně klienta pod Windows pomoci programu Putty :
- Nutné stáhnout z http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html programy putty.exe, plink.exe a uttygen.exe .
- V programu puttygen.exe v Conversions>Import naimportovat Váš privátní klíč a uložit na disk.
- V programu Putty vytvořit spojeni SSH na server Slon a v nastavení spojení nastavit
Connection > SSH > Preffered protocol SSH2 Connection > SSH > Auth nastavit cestu k privátnímu klíči z Puttygen
- Následně celé spojení uložit pomoci Save. Save je přístupné pouze z úvodní záložky Session.
- Ověření spojení z Putty pomoci Open. Mělo by dojit k zalogováni na server bez zadání hesla.
Pro otevření repositáře je pak nutné zadávat cestu ve tvaru
ssh+svn://<user>@<nazev spojeni v putty>/....
V případě jednotlivých klientů (Rapid SVN, Tortoise SVN, ...) je možná nutnost dalších nastavení.
- Rapid SVN
- Editace subversion konfigurace ve Windows profile adresáři pod Application Data\Subversion\config.
- V sekci [tunnels] nastavte cestu k programu plink.exe. Pozor na rozdíl znaků / a \. Např.
ssh = $SVN_SSH C:/Program Files/putty/plink.exe
Základní použití
- Vytvoření repositáře
svnadmin create cesta/k/repositari/repositar
- Import dat do repositáře
svn import muj_adresar file:///cesta/k/repozitari/repozitar -m "Import dat"
- Výpis obsahu repositáře
svn list file:///cesta/k/repozitari/repozitar
- Získání pracovní kopie repozitáře
svn checkout file:///cesta/k/repozitari/repozitar # repozitář je na lokálním počítači svn checkout svn+ssh://server.domena.cz/cesta/k/repozitari/repozitar # přístup k repozitáři přes svn server # a šifrované připojení ssh
Základní pracovní cyklus
- aktualizace pracovní kopie
svn update
- změny v pracovní kopii: Nově vytvořený soubor v pracovním adresáři není automaticky přidán do pracovní kopie. Nový soubor se zařadí do pracovní kopie až provedením příkazu
svn add novy_soubor
. Nový adresář je také nutné přidat příkazemsvn add novy_adresar
, nebo ho už vytvořit příkazemsvn mkdir novy_adresar
. Soubory není možné jednoduše z pracovní kopie vymazat příkazemrm soubor
, musí se k tomu použít příkazsvn rm soubor
.
svn add soubor # přidání souboru nebo adresáře - implicitně včetně podadresářů - do pracovní kopie svn rm soubor # vymazání nemodifikovaného souboru nebo adresáře # soubor se okamžitě odstraní z pracovní kopie, # adresář, který není prázdný, se neodstraní, ale označní pro vymazání - k odstranění # dojde až po provedení přikazu commit # --force : vymaže modifikovaný i soubor který není ve správě subversion svn rmdir adresar # vymazání adresáře svn copy soubor # kopírování souboru nebo adresáře svn move soubor # přesun souboru nebo adresáře
- zjištění změn v pracovní kopii
svn status # vypisuje změny pracovní kopie vzhledem k revizi pracovní kopie uložené v adresáři .svn # nezjišťuje aktuální stav v repozitáři # -v : podrobnější výpis # -u : provede porovnání z repozitářem a hvězdičkou označí soubory změněné v repozitáři i v # pracovní kopii, tedy soubory u nichž by po provedeni příkazu update nastal konflikt # A - soubor je přidán do pracovní kopie # D - soubor je vymazán z pracovní kopie # M - soubor je změměn # C - soubor je v konfliktu (soubor byl modifikován a současně je v repozitáři novější # verze tohoto souboru) # L - soubor je uzamčen (např při nedokončení aktualizace pracovní kopie - spusťte # příkaz svn cleanup # ? - soubor není ve správě subversion svn diff soubor # výpis změn v obsahu konkrétního souboru
- zahození provedených změn v pracovní kopii: příkaz obnový soubor podle stavu v revizi pracovní kopie (z adresáře .svn)
svn revert soubor
- řešení konfliktů, přijetí změn z repositáře
svn update svn resolved soubor
- publikování změn do repozitáře: Každým zveřejněním změn se zvyšuje číslo podlední revize všech souborů v repozitáři o jedničku. To znamená, že jeden soubor může být v revizi číslo 10 vytvořen, v revizích 11 až 35 beze změny a modifikován až v revizi 36. Revize 11 až 35 se bude týkat modifikace jiných souborů v repozitáři.
svn commit # -m 'zprava zveřejnění změn' # proměnná SVN_EDITOR nebo EDITOR určuje jaký editor bude spuštěn pro editaci zprávy # pokud není zadána pomocí parametru -m
- export souborů z repozitáře (adresářový strom bez adresářů .svn)
svn export svn+ssh://server.domena.cz/cesta/k/repozitari/repozitar adresar_pro_export # -r cislo revize svn export file:///cesta/k/repozitari/repozitar adresar_pro_export svn export adresar_pracovni_kopie adresar_pro_export
Řešení konfliktů
Konflikt verzí nastává tehdy, pokud byl soubor, který je v pracovní kopii v repozitáři změněn jiným uživatelem. Konfliktům můžeme předcházet používáním příkazu svn status -u. Typy konfliktů:
- U - soubor neobsahuje lokální změny, ale byl změněn v repozitáři
- G - lokálně změněný soubor byl změněn také v repositáři, ale změny se nepřekrývají a bylo automaticky provedeno sloučení
- C - konflikt, který je nutné vyřešit editací (ručně): V tomto případě svn vytvoří soubory
soubor.txt.mine # midifikovaný soubor pracovní kopie soubor.txt.r8 # soubor v revizi pracovní kopie soubor.txt.r9 # soubor v revizi repozitáře (HEAD revision) soubor.txt # soubor, kde jsou obě verze, ovšem nesloučené
- Prosazení své lokální verze
svn resolve --accept working soubor.txt
- Ruční editace souboru
soubor.txt
- v souboru jsou dvě varianty (lokální a ta z repositáře) odděleny speciálními řádky
<<<<<<< .mine lokální verze ======= verze z repositáře >>>>>>> .r9
- Po ručním sloučení obou verzí a vymazání speciálních řádků se provede příkaz
svn resolve --accept working soubor.txt
- Zahození své lokální verze ve prospěch verze v repositáři
svn resolve --accept theirs-full soubor.txt
- Alternativně je také možné použít příkaz
svn revert soubor.txt
- Příkazem
resolve
se vyřeší konflikt v pracovní kopii. Zveřejnění změn do repositáře je nutné provést příkazemcommit
.
Historie revizí
svn log # parametrem -r 8 nebo -r 1:8 udáváme číslo revize svn cat -r 8 # vypisuje obsah souboru z revize 8 svn list -r 8 # vypisuje obsah aktualního adresáře takový, jaký byl v revizi 8
Ukázka GUI rapidsvn (MS Windows)



Poznámky
Replikace repozitáře
mkdir $DIR
svnadmin create $DIR
cd $DIR
echo "#!/bin/sh" > hooks/pre-revprop-change
chmod 755 hooks/pre-revprop-change
svnsync init $TO $FROM