Subversion (SVN) je sistem za sledenje spremembam izvorne kode, ki omogoča sočasno delo na skupnem projektu. Pri vsaki shranitvi na SVN strežnik, se shranijo le spremembe datotek, ki so bile dane pod nadzor. S hranjenjem vseh verzij izvorne kode je tako lažje nadzorovati razvoj projekta, slediti spremembam in oceniti njihov vpliv na delovanje celotnega projekta. Ker se hranijo vse verzije določene datoteke, lahko tako delamo le na eni datoteki, ne da bi bilo potrebno shranjevanje stabilnih ali kako drugae pomembnih verzij datoteke. Način dela je tako lahko časovno in prostorsko razporejen. Delo na projektu je s Subversion enostavno razdeliti na manjše naloge, ki jih ob vsaki shranitvi na strežnik na kratko opišemo kot delo, ki ga poslane spremembe kode opravijo. Strežnik hrani razlike v izvorni kodi, kar omogoča sledenje in dostop do prejšnjih verzij. Po vzpostavitvi hranilnika SVN lahko vanj shranjujemo datoteke in SVN za nje avtomatsko vodi verzioniranje.
Po vzpostavitvi SVN je potrebno nažeti z novim imenikom s tem, da uvozimo prazen SVN z ukazom:
svn checkout --username=ime svn://forge.hpc.fs.uni-lj.si/projekt/trunk mojprojekt
kar naredi nov imenik mojprojekt. Vanj lahko dodajamo datoteke. Lahko pa le te uvozimo že iz obstoječega imenika z ukazom svn import. Možno pa je uvoziti SVN v že obstoječi imenik in ročno dodajati datoteke pod nadzor. V vsakem imeniku, ki je pod nadzorom se ustvari "skriti" imenik, ki vodi evidenco in hrani lokalno kopijo datotek.
Datoteke ki so že pod kontrolo SVN lahko prosto urejamo z urejevalnikom. Stanje datotek v imeniku SVN izpišemo z ukazom
svn status
leon@duo:~/p/ppgplasma/doc$ svn st
? phd.ps
? auto
M phd.toc
M phd.tex
Vprašaj pred imenom pomeni, da datoteka ali imenik ni pod SVN nadzorom in za take datoteke so možni naslednji ukrepi:
- Ne zmenimo se za opozorilo. Ker pri večjem številu opozoril lahko kakšno pomembno datoteko spregledamo to ti priporočljiv način dela.
- Če je datoteka pomembna in se je ne da enostavno izpeljati (prevesti) iz drugih datotek, se datoteko da pod SVN nadzor z ukazom svn add datoteka
- Nastavimo, katere datoteke se v imeniku ignorirajo. To je priporo?eno za vse datoteke, ki so rezultat pretvorbe ali so pomo?nega tipa. V imeniku nastavimo spregledovanje datotek z ukazom svn pe svn:ignore .
V zgornjem primeru dodamo ignoriranje za vse datoteke s končnico .toc in še za imenik auto. Za datoteko phd.ps se zaenkrat še nismo odločili, ali naj bo pod kontrolo ali ne saj so te datoteke obićajno velike in so rezultat pretvorbe.
Datoteke, ki so spremenjene (Modified) imajo pred imenom ?rko M, kar pomeni, da je lokalna kopija različna od tiste, ki smo jo nazadnje osvežili z ukazom
svn update
Če želimo izpis naših popravkov to naredimo z ukazom
svn diff datoteka.tex
ali samo
svn diff
za vse spremembe v spremenjenih datotekah. Svoje spremembe pošljemo na SVN strežnik z ukazom
svn ci -m "Spremenjen format strani in velikost črk"
Sending doc Sending doc/phd.tex
Sending doc/phd.toc
Transmitting file data ..
Committed revision 260.
Pri tem se pošljejo na strežnik spremembe vse spremembe spremenjenih datotek. Datoteka phd.toc je bila pod nadzorom in se je vseeno poslala, kot sprememba, čeprav je bilo dodano *.toc v svn:ignore, kar pomeni, da je svn:ignore le pomoč pri izpisu stanja in ne izključuje datotek, ki jih ročno damo pod SVN kontrolo. Za datoteko phd.toc je bilo to narejeno pomotoma, zato lahko z ukazom
svn del *.toc
hkrati lokalno pobrišemo in označimo datoteko phd.toc za brisanje na strežniku, kar vidimo pri izpisu kot črko D pred datoteko:
leon@duo:~/p/ppgplasma/doc$ svn st
? phd.ps
D phd.toc
Novo datoteko damo pod kontrolo z ukazom
svn add datoteka
Podobno velja za imenike in preimenovanja/kopiranja/premikanja datotek kjer uporabimo ukaz
svn mv prvotno.ime novo.ime
svn copy prvotno.ime kopija.ime
kar je bolje uporabiti kot pa ukaza ADD/DEL saj je pri tem možna sledljivost verzij od prvotne pa vse do zadnje verzije posamezne datoteke, ki se je premikala po imenikih, preimenovala ali kopirala.
Sočasno delo na datotekah
Hkratno urejanje datotek je možno in običajno ne povzroča konfliktov. Konflikti nastanejo le takrat, ko dva hkrati popravita isto vrstico in SVN ne ve kateri popravek je pravilen. SVN celo onemogoča, da bi poslal spremembe na strežnik in s tem pobrisal spremembe drugih sodelujočih. Zato se priporoča, da se spremembe sproti dopolnjujejo z ukazom
svn update
Ko pa s svojim delom sprememb zaključimo pa le te pošljemo z ukazom
svn ci -m "V eni vrstici opisane spremembe"
Pred pošiljanjem seveda dodamo nove datoteke in na sploh preverimo stanje lokalne kopije z ukazom
svn status
Za več pomoči je na voljo ukaz
svn help
ali prosto dostopna knjiga na spletni strani http://svnbook.red-bean.com/
Primer lokalnega dela s SVN imenikom
SVN imenik lahko dobimo vzpostavljen na strežniku do katerega lahko dostopamo z metodama svn:// ali z http:// Lahko pa naredimo SVN skladišče kar v domačem imeniku z ukazom
[leon@prelog ~]$ mkdir repos
[leon@prelog ~]$ svnadmin create repos/projekt
in do njega dostopamo z načinom file:// tako da ga izvozimo v domači imenik z ukazom
[leon@prelog ~]$ svn checkout file://$HOME/repos/projekt projekt
Checked out revision 0
V ta imenik gremo s cd in pogledamo prazno vsebino:
[leon@prelog ~]$ cd projekt
[leon@prelog projekt]$ ls -la
skupno 12
drwxrwxr-x 3 leon leon 4096 okt 26 12:17 .
drwx--x--x 44 leon leon 4096 okt 26 12:17 ..
drwxrwxr-x 6 leon leon 4096 okt 26 12:17 .svn
Za večje projekte običajno naredimo tri dogovorjene imenike in jih shranimo v SVN z
[leon@prelog projekt]$ svn mkdir trunk branches tags
A trunk
A branches
A tags
[leon@prelog projekt]$ svn ci -m "Začetna vzpostavitev strukture"
Adding branches
Adding tags
Adding trunk
Committed revision 1
Naredimo manjši projekt z datoteko Makedile in izvorno datoteko hello.c z naslednjimi ukazi:
[leon@prelog projekt]$ cd trunk
[leon@prelog trunk]$ kate Makefile hello.c &
[1] 1474
[leon@prelog trunk]$ ls
hello.c Makefile
[leon@prelog trunk]$ make
cc hello.c -o hello
[leon@prelog trunk]$ ./hello
Test SVN
in naslednjo "minimalno" vsebino Makefile in hello.c
[leon@prelog trunk]$ cat hello.c
#include <stdio.h>
int main()
{
printf("Test SVN\n");
}
[leon@prelog trunk]$ cat Makefile
all: hello
ki jo shranimo v SVN tako, da dodamo izvorno kodo in izločimo verzioniranje izvršne kode z eksplicitnim vnosom lastnosti imenika.
[leon@prelog trunk]$ svn st
? hello
? hello.c
? Makefile
[leon@prelog trunk]$ svn add hello.c Makefile
A hello.c
A Makefile
[leon@prelog trunk]$ export EDITOR=kate
[leon@prelog trunk]$ svn propedit svn:ignore .
QObject::disconnect: Unexpected null parameter
Set new value for property 'svn:ignore' on '.'
[leon@prelog trunk]$ svn st
M .
A hello.c
A Makefile
[leon@prelog trunk]$ svn ci -m "Osnutek projekta"
Sending trunk
Adding trunk/Makefile
Adding trunk/hello.c
Transmitting file data ..
Committed revision 2.
Program popravimo tako, da izpiše klasični pozdrav Hello, world in pogledamo razliko kode z
[leon@prelog trunk]$ svn diff
Index: hello.c
===================================================================
--- hello.c (revision 2)
+++ hello.c (working copy)
@@ -1,5 +1,5 @@
#include <stdio.h>
int main()
{
- printf("Test SVN\n");
+ printf("Hello, World\n");
}
Popravek nam ni všeč, zato kodo kar pobrišemo in spravimo na zadnjo verzijo z
[leon@prelog trunk]$ rm *
[leon@prelog trunk]$ ls
[leon@prelog trunk]$ svn up
Restored 'hello.c'
Restored 'Makefile'
At revision 2.