Sunteți pe pagina 1din 10

Laborator 2: Versioning, SVN ? Responsabil: Sorin Ciolofan sorin.ciolofan@cs.pub.ro ? Data publicarii: 24-02-2013 ?

Data ultimei modificari: 25-03-2013 Obiective Scopul acestui laborator este familiarizarea cu sistemele de versioning, utile i n contextul dezvoltarii concurente a proiectelor, in echipe de programatori. Sistemele discutate sunt: SVN si GIT. Version Control Systems (VCS) VCS-urile servesc la gestionarea versiunilor multiple ale unor unitati de inform atie (de exemplu fisierele sursa ale unui proiect), intr-un mediu colaborativ. F iecarui document i se asociaza un numar de versiune, numit revision. La fiecare modificare, acesta este incrementat si memorat impreuna cu autorul schimbarii. L a orice moment de timp se poate reveni (revert) la o versiune anterioara a unui document. Un teren propice pentru intrebuintarea unui astfel de sistem il consti tuie wiki-urile. Motivatia principala consta in posibilitatea ca diferiti membri ai echipei, afla ti eventual in spatii geografice indepartate, sa poata lucra simultan la proiect , urmand ca, la final, modificarile lor sa fie reunite in noi versiuni ale proie ctului. De asemenea, exista si alte avantaje. Cand se observa un bug, se poate r eveni la o versiune anterioara, in vederea determinarii momentului introducerii acestuia in program. In acelasi timp, se poate urma o dezvoltare pe ramuri (bran ches), in care se lucreaza, in paralel, la multiple versiuni ale proiectului - d e exemplu, una in care se doreste inlaturarea bug-urilor, iar cealalta, in care se urmareste adaugarea de noi functionalitati, inaintea slefuirii celor existent e. O modalitate de reducere a spatiului utilizat pentru stocarea intregului istoric al proiectului o constituie delta compression. Aceasta reprezinta un mecanism p rin care se retin doar diferentele intre versiunile succesive ale documentelor, obtinandu-se o utilizare mai eficienta a spatiului disponibil. Exista doua modele de VCS-uri: ? centralizat (ex: SVN): codul sursa este situat pe un server central, de unde cli entii pot obtine variante de lucru pe masina locala (working copy). Dupa efectua rea locala a modificarilor, dezvoltatorul solicita actualizarea variantei de pe server. ? distribuit (ex: Git): nu exista un server central, procesul de sincronizare desf asurandu-se la nivel peer-to-peer. Terminologia specifica include:

? repository: pe server, contine ierarhia de fisiere si informatiile de versiune ? working copy: varianta locala, obtinuta de la server, pe care se fac modificaril e ? checkout: aducerea pe masina locala a versiunii de pe server, sub forma unei wor king copy ? update: actualizarea working copy-ului in functie de modificarile survenite, int re timp, pe server. Se aduc doar fisierele modificate ? commit: cerere de publicare pe server a modificarilor facute asupra working copy ? revision: versiunea unui document ? import: popularea initiala a unui repository cu un proiect de pe masina locala ? conflict: apare cand 2 utilizatori vor sa actualizeze acelasi document, dar meca nismul nu este capabil sa imbine cele 2 variante. In acest caz, se apeleaza la: ? resolve: actiune pe care utilizatorul o executa pentru a inlatura un conflict (d e exemplu, in cazul de mai sus, acceptarea variantei celuilalt utilizator in def avoarea propriei variante) ? trunk: principala directie de dezvoltare a proiectului (ca insiruire de revision s), in opozitie cu: ? branches: ramuri secundare de evolutie a proiectului (de exemplu, in care se tes teaza feature-uri noi) ? tag: instantaneu la un anumit moment de timp al proiectului, realizat pe trunk s au pe un branch. E folosit de obicei pe cod stabil pentru a marca release-uri. ? merge(S1,S2): aplica la S2 dif(S1,S2)

In cele ce urmeaza, vom prezenta SVN. Doua dintre avantajele sale sunt: ? portabilitatea ? suportul de integrare cu numeroase IDE-uri ca, de exemplu, Eclipse. Subversion (SVN)

SVN este un sistem centralizat, cu urmatoarea arhitectura: SVN Architecture Pentru instalare, puteti rula, de exemplu, pe un sistem Debian: $ apt-get install subversion Aveti la dispozitie o carte free, despre SVN. De la client, accesul la repository-ul de pe server se poate face in trei moduri : ? printr-o schema de adresare locala, cand repository-ul si clientul se afla pe a ceeasi masina: file://<cale_fisier>. ? prin protocolul SVN: svn://<host>/<cale_fisier> ? prin HTTP, folosind un modul al server-ului Apache. Iata o secventa obisnuita de lucru: 1. Crearea unui repository pe server (cu specificarea caii):$ svnadmin create /var /svn/repo 2. Presupunand ca avem la dispozitie sursele proiectului, le incarcam pentru prima oara in repository-ul creat:$ svn import myproject file:///var/svn/repo/myproje ct -m "Initial import" In comanda de mai sus, myproject reprezinta directorul ce contine sursele. Optiu nea -m asociaza mesajul cu actiunea. Ierarhia construita in repo are o structura speciala, fisierele nefiind vizibile ca atare. 3. Pentru afisarea continutului unui director din repository:$ svn list file:///va r/svn/repo/myproject 4. Cand se doreste obtinerea unei working copy pe masina locala:$ svn checkout fil e:///var/svn/repo/myproject myproject Comanda de mai sus aduce proiectul myproject din repository in subdirectorul myp roject, pe masina locala. 5. Fisierele din working copy pot fi editate direct. In schimb, modificarea ierarh iei de fisiere (crearea sau stergere de fisiere/directoare) presupune utilizarea comenzilor:$ svn add ... $ svn delete ... ... si nu a comenzilor obisnuite, precum cp sau mv. In al doilea caz, SVN nu ar fi c onstient de modificarile survenite. 6.

Pentru actualizarea working copy, presupunand ca repository-ul a fost modificat :$ svn update Aceasta comanda va actualiza doar fisierele care au fost modificate pe server, f ara a aduce intreaga ierarhie, ca la checkout-ul initial. 7. Pentru publicarea copiei locale pe server:$ svn commit <fisier> 8. Pentru vizualizarea modificarilor realizate local, de la ultimul update:$ svn s tatus $ svn diff Subclipse Subclipse este un plugin pentru Eclipse, ce permite interactiunea in mod grafic cu repository-ul. Aveti la dispozitie un tutorial. Instalare Verificati ca aveti instalata ultima versiune de Eclipse (4.2.1). Astfel, din meniul Help alegeti Install new software, pentru a porni managerul de actualizari. Introduceti in campul Work with adresa: http://subclipse.tigris.org/update_1.6.x /. Bifati a treia optiune, Subclipse , apoi Next. Acceptati termenii de licentiere si apasati din nou Next. Apasati, in final, Finish, pentru a incepe descarcarea si instalarea componentei Subclipse. Obtinerea copiei de lucru Deschideti perspectiva SVN Repository Exploring si selectati Add SVN Repository. Perspectiva Subclipse. Specificati adresa masinii de pe care obtineti, local, copia de lucru a proiectu lui SVN. Selectarea adresei pentru Repository. Ulterior, puteti selecta folder-ele din proiect ce vor fi aduse intr-o copie loc ala. Alegeti un folder si selectati Checkout. Puteti specifica parametrii pentru aceasta operatie. Numele implicit de proiect va fi acelasi cu numele locatiei r epository-ului ales. Puteti, insa, specifica orice nume doriti, dupa care contin uati, apasand Next: Specificarea parametrilor pentru operatia de Checkout. Puteti preciza locatia unde va fi salvata copia de lucru. Puteti alege orice loc atie de pe disc, dupa care apasati Finish: Specificarea locatiei copiei de lucru SVN. Dupa finalizarea acestor operatii veti vizualiza copia de lucru, in forma proiec t Eclipse. In continuare, toate operatiile SVN pot fi declansate prin apasarea b

utonului drept al mouse-ului si alegerea intrarii Team. Rezultatul final GIT Ca ?i cu multe alte lucruri bune din via?a, Git a nceput cu pu?ina distrugere cre ativa ?i multe controverse. Kernelul Linux este un proiect open source cu o gama de aplicabilitate destul de mare. n marea parte a vie?ii proiectului (1991- 2002 ), schimbarile din cadrul kernelului Linux erau trimise ca ?i patches sau fi?ier e arhivate. n 2002, kernelul Linux a nceput sa foloseasca un DVCS proprietar numit BitKeeper. n 2005, rela?iile dintre comunitatea care dezvolta kernelul ?i firma care dezvolt a BitKeeper s-au stricat, ?i statutul de gratuit al aplica?iei a fost revocat. A ceasta schimbare a impus comunita?ii (?i n special lui Linus Torvalds, creatorul Linux) sa dezvolte propriul sistem bazat pe unele din lucrurile nva?ate n timpul u tilizarii BitKeeper. Unele din scopurile noului sistem au fost: Rapiditate Design simplu Suport puternic pentru dezvoltare nelineara (mii de branch-uri paralele) Complet distribuit Abilitatea de a gestiona proiecte mari similare cu kernelul Linux ntr-un mod efic ient (din punct de vedere al vitezei ?i marimii datelor) ncepnd cu na?terea sa din 2005, Git a evoluat ?i s-a maturizat pentru a deveni u?or de folosit dar pastrnd u-?i toate aceste calita?i ini?iale. Git este incredibil de rapid, este foarte e ficient cu proiecte mari, ?i de?ine un sistem incredibil pentru crearea de branc h-uri utilizate in dezvoltarea neliniara. Principala diferen?a dintre Git ?i oricare alte sisteme de versionare (Subversio n ?i prietenii sai inclusiv) este modul n care Git ?i gestioneaza datele. Conceptu al, majoritatea celorlalte sisteme ?i stocheaza informa?iile ca o lista de schimb ari asupra fi?ierelor. Aceste sisteme (CVS, Subversion, Perforce, Bazaar ?i alte le) vad informa?iile ca o mul?ime de fi?iere ?i schimbarile asupra fi?ierelor n t imp. Git nu vede ?i nici nu stocheaza datele n acest mod. n schimb, Git considera datel e sale mai mult ca o mul?ime de instantanee ale unu mini sistem de fi?iere. De f iecare data cnd face?i commit, sau salva?i starea proiectului dumneavoastra n Git, acesta practic salveaza o poza a starii curente a tuturor fi?ierelor din acel m oment ?i stocheaza o referin?a la acel instantaneu. Pentru a fi eficient, daca exista fi?iere care nu s-au schimbat, Git nu stocheaz a fi?ierul iara?i ci doar o legatura catre fi?ierul anterior stocat identic cu c el din prezent. Aceasta este o distinc?ie importanta dintre Git ?i aproape toate celelalte VCS. Git este un proiect free si open-source disponibil aici. Pentru a instala Git pe o masina Linux, rulati comanda: sudo apt-get install git Pentru a configura git local sau global puteti folosi utilitarul git-config. Spre exemplu: git config --global user.name "John Doe" git config --global user.email johndoe@example.com O alta varianta este sa editati fisierul ~/.gitconfig. Un exemplu de astfel de f isier de configurare este ilustrat mai jos:

# User name & email [user] name = John Doe email = johndoe@example.com # Smtp email [send-email] smtpserver = smtp.example.com # Activate coloring [color] ui = true # Core variables [core] filemode = false # Our diff algorithm [diff] external = /usr/local/bin/diff-wrapper renames = true [branch "devel"] remote = origin merge = refs/heads/devel # Proxy settings [core] gitProxy="ssh" for "kernel.org" gitProxy=default-proxy ; for the rest [include] path = /path/to/foo.inc ; include by absolute path path = foo ; expand "foo" relative to the current file path = ~/foo ; expand "foo" in your $HOME directory Un tool grafic util pentru Git, este gitk. Pentru a il instala, rulati sudo apt-get install gitk Rezultatul afisat la rularea gitk in interiorul unui proiect Git este similar cu cel de mai jos: Atunci cand dori?i sa lucra?i cu Git, veti dori fie sa obtineti o clona locala a unui proiect remote, fie sa incepeti un nou proiect Git. In primul caz, pentru a obtine o clona locala a unui proiect remote, rulati: git clone git://project_domain.com/project.git In al doilea caz, vom crea un proiect Git local, pe care apoi sa il share-uim cu alti utilizatori. Pentru aceasta trebuie sa: ? cream proiectul: mkdir my_project cd my_project ? initializam proiectul git in folderul creat: git init ? realizam modificarile necesare: ? daca dorim sa ignoram anumite cai din cadrul proiectului (eg. .class, etc.) ?

cream un fisier cu numele .gitignore in radacina proiectului si adaugam pattern -uri de shell care indica fisierele pe care git le va ignora la commit(eg.: bin/ *.class) ? verificam statusul proiectului git folosind: git status ? veti putea observa fisierele adaugate pentru a fi comise, pe cele ne-adaugate p recum si pe cele care nu au fost track-uite: ? pentru a renunta la modificarile adaugate pentru commit, rulam: git reset HEAD file ? pentru a readuce un fisier modificat la versiunea remote/initiala, rulam: git checkout -- file ? adaugam fisierele modificate: git add . ? verificam logul proiectului: git log ? commitem modificarile facute(cu semnatura utilizatorului curent): git commit -s -m "mesajul de commit" ? verificam logul proiectului pentru a ne asigura ca noul commit apare acum in lo g: ? in cazul in care am uitat sa ignoram anumite fisiere, si acestea au ajuns in ul timul commit, rulam: git rm --cached file ? pentru a modifica ultimul commit, putem folosi: git commit --amend ? daca dorim sa verificam branch-ul curent(in mod predefinit, branchul curent est e master): git branch ? daca dorim sa cream un nou branch din branchul curent: git checkout -b new_branch_name ? daca dorim sa stergem un branch(care nu este branchul curent): git branch -D branch_name ?

daca dorim sa revenim la un alt branch, sau commit_id: git checkout branch_name(commit_id) ? pentru a comite remote: git push origin master ? pentru a downloada ultimele modificari remote dar fara a le merge-ui cu reposit ory-ul local: git fetch ? pentru a lua ultimele modificari din repository-ul remote: git pull origin master ? pentru a vedea diferentele intre versiuni de fisiere/branch-uri git diff file Pentru mai multe comenzi utile pentru lucrul cu Git, vizitati tutorialul Git. Egit Este un plugin pentru Eclipse, ce permite interactiunea in mod grafic cu reposit ory-ul. Instalare Verificati ca aveti instalata ultima versiune de Eclipse (4.2.1). Pentru instalare: din meniul Help alegeti Install new software, pentru a porni m anagerul de actualizari. Introduceti in campul Work with adresa: http://download.eclipse.org/egit/updates . Bifati prima optiune, Eclipse Git Team Provider , apoi Next. Acceptati termenii de licentiere si apasati din nou Next. Apasati, in final, Finish, pentru a incepe d escarcarea si instalarea componentei. Exemplu Creati un nou proiect Git. Adaugati in acest proiect o noua clasa Git : public class Git { public static void main(String[] args) { System.out.println("Git"); } } Pentru a creea un repository local: Click dreapta proiect ? Team ? Share Project ? Git. Alegeti Create Repository ? Finish. In acest moment s-a creat un reposi tory local. Repository-ul git se va stoca in proiect, in folderul .git Exercitii Utilizati scheletul de laborator. Pentru exercitiile din laborator puteti fie sa faceti un cont pe unfuddle.com, u

nde va veti crea un repository sau sa lucrati cu serverul de svn instalat pe mas ina. Pentru serverul local trebuie urmati pasii de mai jos: 1. Creati un repository svn in directorul home al userului student svnadmin create /home/student/svn-repo 2. In fisierul /home/student/svn-repo/conf/svnserve.conf decomentati linia: #password-db = passwd 3. Adaugati numele utilizatorilor si parolele acestora in fisierul /home/student /svn-repo/conf/passwd 4. Porniti serverul SVN ruland comanda: svnserve -d -r //home/student/svn-repo/ Repository-ul este acum accesibil prin url-ul svn://localhost. 1. Instalare Subclipse. ? Pentru inceput, veti verifica daca Subclipse a fost instalat in instanta person ala de Eclipse. In caz contrar, veti urma pasii descrisi anterior pentru instala rea componentei in Eclipse folosind site-ul de update http://subclipse.tigris.or g/update_1.8.x/. 2. Creare repository si importare proiect. ? Creati un proiect Eclipse, ce va contine clasele din arhiva atasata mai sus. ? Importati proiectul in repository-ul proaspat creat, utilizand click-dreapta pe proiect ? Team ? Share Project ? Utilizati ca adresa url-ului obtinut dupa creare repository-ului de pe unfuddle. com sau adresa locala svn://localhost. ? Pentru popularea efectiva a repository-ului cu proiectul din laborator este nec esar un commit initial: Team ? Commit ? Obtineti doua working copies ale proiectului din repository, in forma proiectelo r locale svntest1, respectiv svntest2: Checkout . ? In svntest2 modificati valoarea lui x, faceti commit. Apoi din svntest1 modifica ti valoarea lui x la o alta valoare. ? Faceti un Commit. Carui fapt se datoreaza eroarea primita ? ? Realizati un Update. Observati ca s-au creat fisiere pentru reviziile in care e xista versiuni diferite ale fisierului, si un alt fisier pentru versiunea locala .

? Editati conflictele (Team?Edit Conflicts) pentru a vedea liniile care se afla i n conflict. ? Rezolvati conflictele (Team?Mark resolved) si alegeti versiunea fisierului pe c are vreti sa o pastrati (locala, remote). ? Realizati un Update in svntest1. Acum ambele working copies ar trebui sa coinci da. Modificati din nou variabila x. Realizati Commit.

3. Git. ? Instalati pluginul de Git (egit) folosind site-ul de update : http://download.e clipse.org/egit/updates. si creati un nou proiect. Parcurgand pasii descrisi mai sus pentru a face un commit a unui proiect utilizand GIT. Studiati structura re pository-ului si observati asemanarile si deosebirile utilizarii GIT fata de SVN .

S-ar putea să vă placă și