Documentaţie > Programator > SVN
Despre Subversion
Subversion este un alt sistem de gestiune a versiunii, numit de către unii CVS făcut așa cum trebuie. Gestiunea versiunii? Să zicem că avem un proiect cu un singur fişier, main.c şi doi dezvoltatori: Ion şi Vasile. Fişierul sursă stă undeva pe un server (introducem noţiunea de depozit - repository). Dezvoltatorii şi eventual oricine, pot copia sursa (sursele) pe calculatorul local pentru a o compila şi/sau face modificări. Acest lucru reprezintă o copie de lucru (working-copy), iar faptul că versiunea locală diferă de cea de pe server, şi poate fi modificată fără a o afecta pe aceea, introduce ideea de cutie cu nisip (sandbox). Acum, presupunând că fiecare dintre cei doi dezvoltatori a făcut câte o modificare, a testat-o în cutia cu nisip şi vrea să o publice, apare problema: cum se păstrează pe server o singură versiune? Logic ar fi să trimită fiecare rodul muncii, iar un al treilea, Andrei de exemplu, să compare modificările şi să îmbine cele două fişiere într-unul singur. Aici intervine sistemul de gestionare a versiunii, care rezolvă acest tip de conflicte şi reţine toate versiunile sub denumirea de revizii.
Recapitulând, o singură versiune oficială (repository), o mulţime de copii de lucru (working-copies), un sistem bine pus la punct de trimitere/primire/sincronizare/actualizare/publicare a modificărilor, acesta este pe scurt SVN.
trac foloseşte ca sistem de versionare şi de management al codului Subversion.
Detalii generale comenzi Subversion
Toate comenzile Subversion încep cu svn: svn checkout, svn list, svn commit, etc. Sunt apoi urmate de locaţia repository-ului. Există mai multe metode de acces a repository-ului Subversion (SSH, svnserve, HTTP).
Obtinere surse
Pentru obţinerea unei copii a surselor pe maşina locală, se foloseşte comanda checkout:
$ svn checkout svn://ADRESA_REPOSITORY-ului/
Această comandă crează o copie locală a repository-ului.
Modificare surse
Modificarea surselor poate fi realizată în două moduri:
- adăugarea unui fişier/director nou
- modificarea unui fişier existent
În cazul adăugării unui fişier/director nou, acesta va trebui întâi adăugat la copia locală a repository-ului. Acest lucru se realizează prin intermediul comenzii add:
razvan@anaconda:~/projects/uso-quest/uq-translate$ cd trunk/ razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ ls Makefile README txt2db.c razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ touch beta.c razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ svn add beta.c A beta.c
Dacă se introduce o întreagă structură de directoare şi este laborios să se adauge fiecare intrare pe rând se poate folosi opţiunea --force:
razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ mkdir testdir razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ cd testdir/ razvan@anaconda:~/projects/uso-quest/uq-translate/trunk/testdir$ touch 1 2 3 4 5 razvan@anaconda:~/projects/uso-quest/uq-translate/trunk/testdir$ ls 1 2 3 4 5 razvan@anaconda:~/projects/uso-quest/uq-translate/trunk/testdir$ cd .. razvan@anaconda:~/projects/uso-quest/uq-translate/trunk$ svn add --force testdir/ A testdir A testdir/1 A testdir/2 A testdir/3 A testdir/4 A testdir/5
Înainte de toate: actualizarea copiei locale
Înainte de a începe lucrul asupra copiei locale, aceasta trebuie sincronizată cu repository-ul central. Acest lucru va duce la copierea informaţiilor comise de alţi de dezvoltatori în repository care nu se regăsesc în copia locală. Comanda utilizată este update:
$ svn update
Actualizare repository: commit
Pentru a aduce informaţiile locale pe repository-ul central, va trebui să comitem schimbările. Acest lucru se efectuează folosind comanda commit:
$ svn commit -m 'Mesaj specific.'
Mesajul transmis este cel care este asociat listei de schimbări efectuate.
Autentificare la comitere
Numai utilizatorii care se pot autentifica prin svnserve pot comite schimbări în repository. Pentru a obţine acces de comitere trimiteţi un e-mail la razvan@…. Dacă utilizatorul are drept de commit atunci trebuie să îşi prezinte numele la obţinerea repository-ului:
$ svn checkout svn://username@anaconda.cs.pub.ro/NUME_PROIECT
username este numele de autentificare al utilizatorului pe svnserve.
Înainte de comiterea schimbărilor este bine să se consulte ce schimbări au fost efectuate prin verificarea statutului copiei locale.
Diff/Patching
În anumite cazuri, s-ar putea să nu ai permisiunea de a da commit la modificările tale în repository-ul central. Soluţia în acest caz este de a trimite prin mail unui utilizator cu drepturi modificările tale, iar acesta să dea commit. Pentru ca lucrurile să se facă eficient, nu se vor trimite toate fişierele modificate, ci doar diferenţele. Pachetul obţinut (o arhivă) se cheamă patch şi se obţine astfel:
$ svn diff > fisier_patch
Statut repository
Statutul repository-ului se referă la ce modicări au fost făcute în copia locală care nu apar în repository-ul central, sau ce schimbări au fost facute în repository-ul central care nu apar în copia locală. Comanda utilizată este status:
$ svn status
Dacă doriți în schimb informații precum URI-ul repository-ului sau când și de către cine s-a făcut ultima modificare, folosiți comanda:
$ svn info
Pentru sincronizarea copiei locale cu repository-ul central se foloseşte comanda commit. Pentru sincronizarea repository-ului central cu copia locală se foloseşte comanda update, prezentată mai sus.
Important de știut
Folosiți SVN pentru a menține o versiune funcțională pe server. Altfel spus, NU dați commit unei versiuni locale, înainte de a verifica dacă aceasta este funcțională.
Pentru mai multe informații/resurse: http://subversion.tigris.org/
