SVN használat

Az alábbi dokumentum célja, hogy technikai szinten tisztázzon pár fogalmat az SVN használattal kapcsolatban.

Definíciók

Az SVN-ben definiált fogalmak és műveletek móricka-definíciója:

Fogalmak

  • repository - A központi, szerver oldali, verziózott fájl-tároló, ebből csak egy példány van. Egy fál, vagy könyvtár több eltérő verzióját, azonosítható módon tartalmazza. Az alábbiakban a REP vagy URL rövidítést is használjuk a repository jelölésére.
  • verzió - A repositoryban tárolt fájlok egy adott pillanat beli állapota, egyfajta sorszámozott snapshot.
  • HEAD - A repositoryban tárolt legfrisebb verziószám jelölésére használatos elnevezés. Általában ha nem adunk meg verziószámot, az alapértelmezett a HEAD lesz.
  • branch - „Fejlesztési ág”, „ág”. A repository azon része, alkönyvtára, mely egyedi fejlesztéseket, kísérleti ágakat, támogatott disztribúciókat tartalmazza. Jellemzően a /branches könyvtárban kap helyet minden branch.
  • stable branch - „Stabil ág”. Egy olyan, hosszabb távú támogatást élvező, jellemzően verziószámmal ellátott branch, melyet a fejlesztők „stabil” verziónak jelöltek meg. Csak a kritikus frissítéseket szokás belevezetni. Célszerűen csak egy ilyen van. Elterjedt megoldás, hogy a trunk látja el ezt a feladatkört, de elképzelhető más gyakorlat is.
  • development branch - „Fejlesztői ág”. Értelemszerűen egy olyan branch, melyben fejlesztői, kísérleti munka folyik. Jellemzően több ilyen lehet.
  • trunk - „Kódtörzs”, „törzs”. A repository azon része, alkönyvtára, mely a szoftver fő fejlesztési irányát, kódbázisát képviseli. Jellemzően a /trunk alkönyvtárban kap helyet. A trunk-ben jellemzően minden fájl csak egyszer szerepel. Általában a trunk is egy branch.
  • tag - „Jelölés”, „jel”, „címke”. Egy branch egy adott verziójának megkülönböztető céllal készített másolata. Jellemzően a /tags könyvtárban kap helyet. Elterjedt megoldás a stable branch fő verzióit tag-ekkel megjelölni, úgy, hogy a tag neve az adott stable branch verziószámát is tartalmazza. A tag gyakorlatilag egy soha meg nem változó, „statikus” branch.
  • working copy - „Munkamásolat”, „munkapéldány”. Egy fejlesztő által használt, a repository egy adott verziójából készült részleges, vagy teljes másolat, jellemzően egy branch vagy tag alkönyvtárának másolata. A másolatban .SVN nevű könyvtárakban meta-információk tárolódnak, melyeket kézzel szerkeszteni, másolni nem szabad. Jellemzően fejlesztői célokat szolgál. Általában a working copy csak egy branch adatait tartalmazza, nem szokás az egész repository-t working copyként használni. Az alábbiakban a WC rövidítést is használjuk a working copy jelölésére.
  • export - A repository egy adott verziójából készült részleges, vagy teljes másolat, egy branch vagy tag másolata. Ezt a fajta másolatot nem köti semmi a repository-hoz, így a rajta végrehajtott módosítások visszajuttatására már nincs lehetőség. Jellemzően disztribúciós célokat szolgál, ezért jellemzően a stable branch másolataként tekinthetünk rá.

Alapvető halmazműveletek

  • commit - A working copyban végrehajtott változtatások (vagy részhalmazuk) alapján új repository verzió létrehozása, a változtatások feltöltése. Fontos lépés a commithoz tartozó megjegyzési mező kitöltése, mely naplóbejegyzésként funkcionál a repository-ban. Ha több fejlesztő párhuzamosan ugyanazokat a fájlokat, ugyanazokon a helyeken módosítja a working copy-ban, az időrendben későbbi commit sikertelen lesz és az azt kezdeményező fejlesztő feladata a módosítási ütközések („conflict”) feloldása.
  • update - A working copy frissítése a repository, vagy branch valamely újabb verziója alapján, a lokális változásokat megőrizve. A commit-hoz hasonlóan itt is ütközések léphetnek fel, melyeket szintén fel kell oldania az update-et kezdeményező felhasználónak.
  • revert - A working copy-n (vagy részhalmazán) végrehajtott változtatások eldobása.
  • resolve - A commit vagy update által felderített ütközések feloldása. Alapvetően minden ütközés manuális beavatkozást igényel. A magasszintű eszközök általában fejlett támogatást nyújtanak hozzá.

Alapvető fájlműveletek

  • copy - Univerzális fájlművelet, fájlok vagy alkönyvtárak másolására használható különböző források és célok között, az SVN meta-információk megőrzésével. Létezik WC → REP, WC → WC, REP → WC és REP → REP irányú copy.
  • move, rename - Univerzális fájlművelet, a copy-hoz hasonlóan működik, de nem másolja, hanem mozgatja a fájlokat, alkönyvtárakat a megadott forrásból a célba.
  • delete - Univerzális fájlművelet. A copy és a move/rename műveletekhez hasonlóan működik, fájlok és könyvtárak törlésére használatos a working copy vagy a repository oldalán.
  • add - A working copy területén létrehozott új fájlok és könyvtárak hozzáadása a verziókövető-rendszerhez. A következő commit már ezeket is érinteni fogja. Értelemszerűen azon új fájlok és könyvtárak, melyekhez nem hozzuk létre az SVN meta-információkat az add művelettel, nem kerülnek bele a commitba. Sok SVN frontend (pl.: TortoiseSVN) a commit során automatikusan felajánlja az add lehetőségét, ezzel azonban óvatosan kell bánnunk, mert nem célszerű pl. a szövegszerkesztő által létrehozott átmeneti álományok verziókövetőbe történő betöltése.

Egyéb, ritkábban használatos elemi műveletek

  • checkout - A working copy kezdeti kimásolása a repository-ból. Jellemzően a fejlesztői munka megkezdése előtt, egyszer kell végrehajtani.
  • import - Még nem verziókezelés alatt álló fájlok és könyvtárak kezdeti betöltése a repository-ba.
  • export - Export készítése (lásd: fogalmak).
  • switch - Working copy váltása. Eredménye gyakorlatilag azonos a working copy-ban található adatok kidobásával és egy másik branch checkout-olásával. Biztonsági ellenőrzéseket végez, hogy nem commitolt módosítások ne veszhessenek el és nem végez fölösleges fájlműveleteket. A repository URL változásának követésére is használható.
  • lock - A repository egy részéhez (alkönyvtárához, fájljához) tartozó terület zárolása. A lock megnehezíti a commitot a többi fejlesztő számára, de nem akadályozza azt meg (van „forced” commit és „forced” lock). Jellemzően nagyobb átalakítások során használatos, nem a mindennapi munka eszköze.
  • unlock - A lock inverz művelete, a zárolás feloldása.
  • merge - Az egyik legösszetettebb feladatot ellátó SVN művelet. Általános esetben a megadott két branch megadott két verziója közti különbségeket (ún. „changeset”) kigyűjti, majd alkalmazza ezeket egy working copyra. Ha a megadott verziókat M és N betűkkel, a különböző helyeket pedig 1, 2 és 3 számokkal jelöljük, a következő esetek valósíthatók meg: (REP1@M - REP2@N) → WC, (WC1@M - WC2@N) → WC3, (REP@M-N) → WC, (WC1@M-N) → WC2.

Példák

Az alábbiakban a fejlett SVN használat, főként branching és tagging, jobb megértéséhez mutatunk pár gyakorlati példát. A példákban a műveletek általános leírásán kívül az SVN parancs parancssori használatát is szemléltetjük. A magasabb szintű SVN frontendek esetében az egyes műveletekhez külön támogatást is találhatunk, ám ezek is a szemléltetett primitív műveletekből épülnek fel.

A példákban használt repository (standard) alapfelépítése a következő:

/calc/tags
/calc/branches
/calc/trunk

A feltételezett repository URL: http://svn.example.com/repos/calc

Branch (vagy tag) létrehozása

A branch létrehozását mindig a repository oldalán kell kezdeményeznünk. Erre a feladatra a copy művelet a megfelelő. Jellemzően a trunk másolatát készítjük el. Ugyanez az eljárás használható tag létrehozására is.

Például, ha az új branch neve „my-calc-branch”, az alábbi parancsot kapjuk:

$ svn copy http://svn.example.com/repos/calc/trunk \
           http://svn.example.com/repos/calc/branches/my-calc-branch

Branch törlése

Ha egy branch-ra már nincs szükségünk, nyugodtan törölhetjük, hisz a verziókövető rendszerben megmarad. A working copy egyszerűen törölhető, a repository oldalt pedig a delete művelettel törölhetjük.

Például az alábbi parancssort kapjuk:

$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
             -m "Removing obsolete branch of calc project."

Branch visszaállítása

A branch törlése, ahogy ezt említettük, nem jelenti a repository-ból való eltávolítását, csupán azt, hogy nem szerepel többé a HEAD verzióban. Egy megadott verzióban (pl.: 374) még létező branch visszaállítását a copy művelettel végezhetjük.

$ svn copy -r 374 http://svn.example.com/repos/calc/branches/my-calc-branch \
                  http://svn.example.com/repos/calc/branches/my-calc-branch

Branch visszaolvasztása a trunk-be

A lépések a következők:

  • Checkoutoljuk és/vagy updateljük a trunk-öt. A példánkban a WC a calc/trunk könyvtárban van.
  • A kiválasztott branch összes módosítását merge művelettel beolvasztjuk a working copy-ba. Jelen példánkban feltételezzük, hogy a branch létrehozásának verziószáma 341, az aktuális verzió pedig általában a HEAD.
  • Státuszt kérünk, feloldjuk az esetleges ütközéseket, stb.
  • Commitoljuk a módosított trunk working copy-t.
$ cd calc/trunk
$ svn update
At revision 405.

$ svn merge -r 341:HEAD http://svn.example.com/repos/calc/branches/my-calc-branch
U   integer.c
U   button.c
U   Makefile

$ svn status
M   integer.c
M   button.c
M   Makefile

# ...examine the diffs, compile, test, etc...

$ svn commit -m "Merged my-calc-branch changes r341:405 into the trunk."
Sending        integer.c
Sending        button.c
Sending        Makefile
Transmitting file data ...
Committed revision 406.

Hivatkozások

svn.txt · Utolsó módosítás: 2010-12-03 00:00 (külső szerkesztés)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0