Subversion miért és hogyan

Megpróbálom röviden összefoglalni, hogy miért is kell nekünk a Subversion és hogyan kell használni. Azt hiszem ez inkább hosszúra sikerült, de remélem legalább hasznos lesz. :-)

Ez az íromány eredetileg egy olyan projekthez készült, ami CVS-ről állt át. Aki nem ismeri a CVS-t, nyugodtan átugorhatja a következő részt. Majd esetleg írok egy teljesen alap leírást...

Miért Subversion?

Itt leginkább azt tudom összefoglalni, hogy mi az, amint a Subversion tud és a CVS nem. De egyébként egy fontos szempont az, hogy a Subversion úgy lett kifejlesztve, hogy a CVS felhasználok minél könnyebben térhessenek át. :-) Úgy hogy a parancsok nagy része ismerős lesz (de azért vannak különbségek!). Amúgy átgondoltabb és sok mindenben logikusabb, mint a CVS (persze, tanultak a sok-sok CVS tapasztalatból).

Mi a különbség a használatban a CVS-hez képest?

Itt most csak néhány legfontosabb eltérést írom le, amit könnyű elrontani, ha valaki áttér.

M : ezt a file-t te módosítottad és még nem committoltad be (Modified)
U : ennek a file-nak újabb verziója volt a repository-ban és most Update-elve lett. Ez az amit a CVS random módon U vagy P betűkkel jelez.
G : ezt a file-t módosítottad, de a repositoryban is egy újabb verzió volt, és most a két változás sikeresen merGe-ölve lett. Ez az, amit a CVS cselesen P-vel jelez, hogy ne tudd megkülönböztetni a sima update-től.
C : uaz., mint a CVS-ben: Conflict
A : ez a file hozzá lett adva
D : ez a file törölve lett

Subversion használata

A repository címe: https://regilemon.cs.elte.hu/svn2/rfid/. És igen, ez a https, ez az a https, úgy hogy első lépésként lehet fogni egy böngészőt és azzal megnézegetni az egészet. Szerintem ez egy nagyon jó feature, hogy bárki megnézheti a repository legfrissebb állapotát minden segédeszköz nélkül.

A valódi használat az svn parancs segítségével történhet, amit mindenki kipróbálhat a cs.elte.hu modern gépein (a 113-ban olyanok vannak).

Hasonlóan, mint a CVS-nél, itt is az svn help a barátunk. Ez a létező alparancsok listáját írja ki egysoros leírással a használatukról. Az svn help parancs egy rövid leírást ad a parancsról és használható opciókról.

Egy kis szóhasználat: a repository az az a valami, ami fent van a szerveren és amiben a project minden verziója el van tárolva. És working copy -nak nevezzük ennek egy kicheckoutolt változatát, ami ott van valahol a könyvtáradban, ami a project egy konkrét verzióját tartalmazva esetleg itt-ott módosítva általad. Ezt a két fogalmat fontos elsajátítani ahhoz, hogy megértsük az svn-es leírásokat.

Az svn részletes manuálját itt találod meg: http://svnbook.red-bean.com/.

Egy minta svn session

Először is checkout-oljuk ki a dolgot. (Ehhez természetesen szükségünk lesz első alkalommal a jelszavunkra).

svn checkout https://regilemon.cs.elte.hu/svn2/rfid/vote/trunk vote

Itt a második vote az egyszerűen egy könyvtár név, amibe az egészet rakni fogja, ez bármi más is lehet.

Dolgozzunk rajta. Ehhez a legfontosabb parancsok az add (itt is mint a CVS-nél minden új file-t vagy könyvtárat hozzá kell adni a working copy-hoz, és aztán egy commit-tal bekerül a repositoryba), delete, move és egy nagyon fontos parancs: revert. A revert bármilyen file-t visszaállít olyan állapotba, amilyen az utolsó update, commit vagy checkout után volt. Tehát, ha módosítottál egy file-t, de rájöttél, hogy nem jó a módosítás, vagy add-oltad ill. delete-elted és mégsem kellett volna ezzel visszaállíthatod.

A módosításaid vagy a file-ok történetének megvizsgálásához a legfontosabbak: status, diff és log.

Ha le akarod tölteni a repositoryba bekerült új dolgokat: update (az svn status -u egy *-al jelöli azokat a file-okat, amik frissültek a repositoryban). Update-nél keletkezhetnek conflictok, ezt az svn ugyanolyan vidám jelöléssel bejelöli a file-ban, de pluszban eltárolja a te eredeti verziódat és a repositoryból lehozott tiszta verziót! Miután feloldottad a conflictot egy resolved paranccsal tudod ezt jelezni az svn-nek.

Ha úgy gondolod, hogy kész vagy valamilyen módosítással, akkor ellenőrizd, hogy ez működik a repositoryban levő legfrissebb változattal is (azaz update-elj) és utána commit-tal tudod feltölteni a változásokat a repositoryba. Minden egyes committal egyel nő a repository verziója. Az egybetartozó változásokat együtt commitold, a különtartozókat -- külön. :-) Írjál értelmes commit log-ot.

Homokozó

Csináltam a repositorynkban egy alkönyvtárat, ami direkt arra való, hogy lehessen kisérletezni és tanulgatni az svn-t:

svn checkout https://regilemon.cs.elte.hu/svn2/rfid/sandbox

Fontosabb alparancsok rövid leírása

Legtöbb svn parancs egy vagy több file vagy könyvtárnevet vár paraméterül. Ha nem adunk meg neki ilyen paramétert, akkor az aktuális könyvtár lesz az. Ha az argumentumok között szerepel könyvtár, akkor az rekurzívan dolgozza fel! Erről általában a -N kapcsolóval lehet lebeszélni (például ha add-olni akarsz egy könyvtárat, de nem az összes benne lévő file-t, akkor először egy svn add -N könyvtár -al add-olod magát a könyvtarat és utána benne egy külön svn add file1 file2 ... -al a kívánt file-okat). Pontosabban néhány "veszélyes" parancsnál a nemrekurzív viselkedés az alapértelmezett (pl. revert), ilyenkor a -R kapcsolóval lehet kérni, hogy mégis az legyen.

add
új file-ok hozzáadása (a working copy-hoz, majd egy commit-tal belekerülnek a repositoryba).
checkout
egy új working copy létrehozása. Egy opcionális argumentumban meg lehet adni egy könyvtárnevet, hogy hová tegye. -r -rel lehet megadni, hogy melyik verziót checkout-olja ki.
commit
a working copyban lévő változások feltöltése a repositoryba. -m -el lehet megadni a commit log-ot, vagy felhoz egy editort. Az alapértelmezett editor rendszerről-rendszerre változik, ha valaki más editort szeretne, ezt --editor-cmd kapcsolóval vagy az EDITOR környezeti változóval megteheti.
copy
ezzel lehet egy file-ból vagy könyvtárból másolatot csinálni. A másolat örökli az eredeti történetét. Ezt használjuk az svn-ben a branch-ek és tag-ek létrehozására is. (Bővebben erről a... Na, majd máskor.)
delete
file-ok vagy könyvtárak törlése. A file-ok csak meg lesznek jelölve és commit-nál valóban törlődnek a working copy-ból. Nem baj, ha előtte a file-t fizikailag törlöd.
diff
változások megjelenítése. Alapértelmezésben a working copy-t diffeli az azonos módosítatlan verzióval, azaz a te változásaidat jeleníti meg. -r -rel lehet megadni, hogy melyik verzióval diff-elje. Ha két kettősponttal elválasztott revisiont adsz meg, akkor azok közötti különbségeket adja. Igazi revisionök helyett lehet írni a következőket:

HEAD: a repositoryban lévő legutolsó
BASE: a working copy-d alapjául szolgáló változat (azaz a legutolsó update-ed ill. commit-od változata).
PREV: a "megelőző" változat, azaz ha kíváncsi vagy, hogy mit is commit-oltál utoljára.
{dátum}: egy megadott dátumkor érvényes változat.

Például:

svn diff -r "16:{2003-12-24}" people
log
commit log-ok listája. -v kapcsolóval kiírja, hogy az adott verziónál milyen file-ok változtak. Ha egy könyvtárra adod ki, akkor az összes olyan log-ot megkapod, aminél valamelyik alatta lévő file változott. Figyelem: ehhez fontos, hogy a könyvtár aktuális verzióban legyen, tehát update-eljük előtte (vagy adjunk meg egy -r HEAD:1 kapcsolot)! Update-elés nélkül, sőt working copy nélkül is megnézhetjük a legútolsó változat log-jait, ha paraméterül egy repository-beli teljes útvonalat adunk meg:
svn log -v https://regilemon.cs.elte.hu/svn2/rfid
move
file ill. könyvtár átnevezése. Ekvivalens egy copy és utána remove-val.
resolved
conflict feloldásának jelzése. Törli a conflictnál keletkezett különböző változatokról készült mentési file-okat.
revert
file visszaállítása olyan állapotra, amilyenben a working copy-d alapjául szolgáló változatban volt (BASE revision).
status
a working copy-d állapotát írja ki a BASE revisionhöz képest. -v kapcsolóval több információt ír ki (pl. a revision számokat). Alapból ez a parancs nem kérdez le a hálózaton semmit, viszont -u kapcsolóval lekérdezi, hogy a repository-bal van-e újabb változat (és ezt egy *-al jelzi).
update
szinkronizálja a working copy-t a megadott revisionhöz (ami, ha nincs megadva, akkor a HEAD, azaz a legfrissebb változat).