Subversion v akciji

Delovne kopije

O delovnih kopijah ste že brali. Sedaj bomo prikazali, kako jih odjemalec Subversion ustvari in uporablja.

Delovna kopija sistema Subversion je običajna struktura map na vašem krajevnem sistemu, ki vsebuje datoteke. Datoteke lahko poljubno spreminjate. Če so to datoteke izvorne kode, lahko iz njih povsem običajno prevedete program. Vaša delovna kopija je vaše zasebno delovno območje: Subversion ne bo v vašo delovno kopijo nikoli vnašal sprememb, ki so jih naredili drugi uporabniki, prav tako vaših sprememb ne bo dal na voljo drugim, razen ko boste to izrecno zahtevali od njega.

Ko ste naredili določene spremembe v datotekah v delovni kopiji in jih preverili, uporabite ukaze sistema Subversion, da spremembe objavite (s pisanjem v skladišče), tako da so vidne ostalim sodelavcem, ki delajo na projektu. Če ostali sodelavci naredijo spremembe na datotekah, vam Subversion omogoča, da te spremembe spojite v delovno kopijo (z branjem iz skladišča).

A working copy also contains some extra files, created and maintained by Subversion, to help it carry out these commands. In particular, your working copy contains a subdirectory named .svn, also known as the working copy administrative directory . The files in this administrative directory help Subversion recognize which files contain unpublished changes, and which files are out-of-date with respect to others' work. Prior to 1.7 Subversion maintained .svn administrative subdirectories in every versioned directory of your working copy. Subversion 1.7 takes a completely different approach and each working copy now has only one administrative subdirectory which is an immediate child of the root of that working copy.

Tipično skladišče sistema Subversion pogosto vsebuje datoteke (ali izvorno kodo) za več projektov; običajno je vsak projekt podmapa v drevesni strukturi skladišča. Pri takšni ureditvi bo uporabnikova delovna kopija običajno ustrezala določenemu podrevesu skladišča.

Recimo, da imate skladišče z dvema projektoma programske opreme.

Slika 2.6. Datotečni sistem skladišča

Datotečni sistem skladišča

Z drugimi besedami, korenska mapa skladišča ima dve podmapi: paint in calc.

To get a working copy, you must check out some subtree of the repository. (The term check out may sound like it has something to do with locking or reserving resources, but it doesn't; it simply creates a private copy of the project for you.)

Suppose you make changes to button.c. Since the .svn directory remembers the file's modification date and original contents, Subversion can tell that you've changed the file. However, Subversion does not make your changes public until you explicitly tell it to. The act of publishing your changes is more commonly known as committing (or checking in ) changes to the repository.

Da bi omogočili dostop do svojih sprememb ostalim, uporabite ukaz objavi.

Sedaj so spremembe v datoteki button.c objavljene v skladišču; če nek drug uporabnik prevzame delovno kopijo iz mape /calc, bo te spremembe videl v zadnji različici datoteke.

Predpostavimo, da imate sodelavko Sally, ki je prevzela delovno kopijo /calc sočasno z vami. Ko objavite spremembe v datoteki button.c, se Sallyjina delovna kopija ne spremeni; Subversion spreminja delovne kopije le na zahtevo uporabnika.

Za posodobitev projekta Sally od sistema Subversion zahteva, da posodobi njeno delovno kopijo z uporabo ukaza update. Ta spoji vaše spremembe v njeno delovno kopijo, prav tako pa tudi vse ostale spremembe, ki so bile objavljene po njenem prevzemu.

Upoštevajte, da Sally ni potrebno povedati, katere datoteke želi posodobiti; Subversion uporabi informacije v mapi .svn in dodatne informacije iz skladišča, da se odloči, katere datoteke je potrebno posodobiti.

Naslovi URL skladišča

Do skladišč Subversion lahko dostopate na več različnih načinov - na krajevnem disku ali preko različnih omrežnih protokolov. Lokacija skladišča pa je vedno navedena z naslovom URL. Shema naslova URL pove način dostopa:

Tabela 2.1. Naslovi URL za dostop do skladišča

ShemaNačin dostopa
file:// Neposreden dostop do skladišča na krajevnem ali omrežnem disku.
http:// Dostop do strežnika Apache s sistemom Subversion preko protokola WebDAV.
https:// Enako kot http://, vendar z enkripcijo SSL.
svn:// Dostop TCP/IP brez avtentikacije preko protokola po meri do strežnika svnserve
svn+ssh:// avtenticiran, enkriptiran dostop TCP/IP preko protokola po meri do strežnika svnserve

V večini primerov se v sistemu Subversion za naslove URL uporablja standardna sintaksa, kar omogoča, da se ime strežnika in številka vrat pojavljata kot del naslova URL. Metoda dostopa file:// se običajno uporablja za lokalni dostop, možno pa jo je uporabljati tudi za poti UNC. URL je naslednje oblike: file://gostitelj/pat/do/skladišča. Za krajevne dostope dela gostitelj ne navedemo ali pa navedemo localhost. Iz tega razloga se krajevne poti običajno zapisujejo s tremi poševnicami: file:///pat/do/skladišča.

Poleg tega morajo uporabniki sheme file:// na operacijskem sistemu Windows uporabljati neuradno standardno sintakso za dostopanje do skladišč, ki so na istem računalniku, vendar na drugem pogonu, kot je trenutni delovni pogon odjemalca. Naslednji dve različici sintakse poti URL sta pravilni; X je pogon, na katerem se nahaja skladišče:

file:///X:/path/to/repos
...
file:///X|/path/to/repos
...
      

Upoštevajte, da se za naslove URL uporablja poševnica, čeprav je znak za ločitev posameznih delov poti v sistemu Windows obrnjena poševnica.

You can access a FSFS repository via a network share, but this is not recommended for various reasons:

  • You are giving direct write access to all users, so they could accidentally delete or corrupt the repository file system.

  • Not all network file sharing protocols support the locking that Subversion requires. One day you will find your repository has been subtly corrupted.

  • You have to set the access permissions in just the right way. SAMBA is particularly difficult in this respect.

  • If one person installs a newer version of the client which upgrades the repository format, then everyone else will be unable to access the repository until they also upgrade to the new client version.

Revizije

Operacija svn commit objavi spremembe poljubnega števila datotek in map v eni atomični transakciji. V delovni kopiji lahko spreminjate vsebine datotek, ustvarjate, brišete, preimenujete in kopirate datoteke in potem objavite celoten nabor sprememb kot celoto.

V skladišču se vsaka objava opravi kot atomična transakcija: upoštevane so vse spremembe v objavi ali pa nobena. Subversion poskuša ohraniti atomičnost zaradi sesutja aplikacij, sistema, težav z omrežjem in ostalih uporabnikov posredovanj.

Vsakokrat, ko skladišče sprejme objavo, se ustvari novo stanje drevesa dototečne strukture, imenovano revizija. Vsaki reviziji se predpiše unikatno naravno število, za eno večje od številke prejšnje revizije. Začetna revizija novo ustvarjenega skladišča ima številko 0 in vsebuje zgolj korensko mapo.

Dober način za predstavitev skladišča je vrsta dreves. Predstavljajte si polje številk revizij, ki se začne z 0 in se razteza od leve proti desni. Iz vsake številke revizije visi drevo datotečnega sistema in vsako drevo je posnetek izgleda skladišča po vsaki objavi.

Slika 2.7. Skladišče

Skladišče

Pomembno je poudariti, da delovne kopije niso vedno odraz samo eno revizije v skladišču; vsebujejo lahko datoteke več različnih revizij. Primer: recimo, da prevzamete delovno kopijo iz skladišča, kjer zadnja shranjena revizija nosi številko 4:

calc/Makefile:4
integer.c:4
button.c:4
      

V tem trenutku delovna kopija ustreza točno reviziji številka 4 v skladišču. Denimo, da naredite spremembe v datoteki button.c in objavite spremembo. Denimo, da se med tem niso zgodile nobene druge objave. Vaša objava bo ustvarila revizijo 5 v skladišču in vaša delovna kopija bo izgledala takole:

calc/Makefile:4
integer.c:4
button.c:5
      

Denimo, da v tem trenutku Sally objavi spremembo datoteke integer.c in s tem ustvari revizijo 6. Če uporabite ukaz svn update, ki posodobi vašo delovno kopijo, bo le-ta izgledala takole:

calc/Makefile:6
integer.c:6
button.c:6
      

Sallyjine spremembe datoteke integer.c se bodo pojavile v vaši delovni kopiji in v datoteki button.c bodo še vedno vaše spremembe. V tem primeru je besedilo datoteke Makefile identično v revizijah 4, 5 in 6, vendar bo Subversion označil vašo delovno kopijo datoteke Makefile s številko revizije 6 in s tem povedal, je datoteka trenutna. Torej: ko boste naredili posodobitev vrhnje datoteke delovne kopije, bo le-ta ustrezala točno eni reviziji v skladišču.

Kako delovne kopije spremljajo skladišče

Za vsako datoteko v delovni kopiji Subversion shrani dve pomembni informaciji v skrbniško področje .svn/:

  • what revision your working file is based on (this is called the file's working revision ), and

  • časovni žig, ki pove, kdaj je bila krajevna kopija nazadnje posodobljena iz skladišča.

S temi informacijami in komunikacijo s skladiščem lahko Subversion ugotovi, v katerem od štirih stanj se delovna datoteka nahaja:

Nespremenjeno in trenutno

Datoteka je nespremenjena v delovni kopiji, prav tako pa od prevzema datoteke ni bila objavljene nobena sprememba v skladišču. Ukaz objavi ne bo storil ničesar, prav tako tudi ne ukaz posodobi.

Krajevno spremenjeno in trenutno

Datoteka v delovni kopiji je spremenjena, v skladišču pa ni bila objavljena nobena sprememba od osnovne revizije. Obstajajo krajevne spremembe, ki niso bile objavljene v skladišču, tako da bo ukaz objavi na datoteki objavil vaše spremembe, ukaz posodobi pa ne bo naredil ničesar.

Nespremenjeno in zastarelo

Datoteka ni bila spremenjena v delovni kopiji, se je pa spremenila v skladišču. Da bo datoteka enaka javni reviziji, jo je potrebno posodobiti. Ukaz objavi ne bo naredil ničesar, ukaz posodobi pa bo prenesel najnovejše spremembe iz skladišča v delovno kopijo.

Krajevno spremenjeno in zastarelo

Datoteka je bila spremenjena v delovni kopiji in v skladišču. Ukaz objavi ne bo uspel; prikazalo se bo sporočilo, da je datoteka zastarela. Datoteko je potrebno najprej posodobiti; ukaz posodobi bo poskušal javne spremembe spojiti s krajevnimi. Če Subversion ne more spojiti različic samodejno, reševanje spora prepusti uporabniku.