Subversion

Z GeoWikiCZ

Stručný návod pro práci se systémem pro správu verzí 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říkazem svn add novy_adresar, nebo ho už vytvořit příkazem svn mkdir novy_adresar. Soubory není možné jednoduše z pracovní kopie vymazat příkazem rm soubor, musí se k tomu použít příkaz svn 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říkazem commit.

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)

svn checkout https://svn.osgeo.org/grass/grass/branches/develbranch_6 grass6_devel
svn update
svn log

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

Výuka

Související články