==Jakin ezine== <0x08>garren alea, <0x07>garren artikulua |=------------------------=[ SVN: Subversion ]=--------------------------=| |=-----------------------------------------------------------------------=| |=---------------------------=[ Espoz&Mina ]=----------------------------=| |=-----------------------------------------------------------------------=| (0). Sarrera (1). Bilgunea sortzen (2). Kodea mantentzen (2.1). Aldaketak (2.2). Gehitu (2.3). Ezabatu (2.4). Kopia (2.5). Berrizendatzea (2.6). Kodearen egoera (2.7). Ezberdintasunak (2.8). Atzerapausuak (2.9). Gatazkak (3). Kodea zabaltzen (3.1). SSH bitartez (3.2). Web bitartez +---------------------+ |(0) Sarrera | +---------------------+ Subversion, modako kode bilgunea. Ziur aski noizbait CVS (Concurrent Versioning System) software bilguneari buruzko zerbait entzun duzue. Kodea bilgune batean mantentzeko sistema da, eta pertsona bat baino gehigoren aldaketak kontrolpean mantentzeko lana errezten du. CVS ez da gehiago garatuko eta bere ordezkoa svn edo Subversion izanen da. Dena den, gauzak ez dira asko aldatuko, aginduen aukerak berdintsuak direlako. Artikulu honetan SVN bilgune bat sortzen eta erabiltzen erakutsiko dugu. Aginduen laburpena: - svn: bezero agindua, gehien erabiliko duguna. - svnadmin: bilgunea kudeatzeko tresna. - svnversion: lan baten egoera ezagutzeko agindua. - svnlook: subversion bilgunea eztertzeko tresna. - svndumpfilter: bilgune jarioak filtratzeko agindua. - svnserve: zerbitzari programa, bilgunea sare bitartez atzigarria izateko. - mod_dav_svn: apache zerbitzariarendako eranskina, bilgunea web bitartez atzigarria izateko. Goazen pausoz pauso +---------------------+ |(1) Bilgunea sortzen | +---------------------+ Bilgune bakar batean proiektu aunitz sar daitezke ala proiektu bakoitzeko bilgune bat sor daiteke. Erabaki hori kudeatzailearen esku geratzen da. Kasu honetan suposatuko dugu aitzinatik proiektu bat daukagula, eta kode hori subversion bilgunean sartu eta kudeatuko dugu. Lehen pausoa bilgune bat sortzea da, eta asmatu duzua svnadmin erabili behar da: jakin# svnadmin create /usr/local/svn Non svn existitzen EZ den direktorioa den. Agindu horrek bilgunea sortzen du eta /usr/local/svn direktorioaren barruan zera ikusiko dugu: jakin# ls -f /usr/local/svn/ . .. dav locks hooks conf README.txt db format jakin# Eta zer dago direktorio horietan? jakin# ls -R /usr/local/svn/ /usr/local/svn/: README.txt conf dav db format hooks locks /usr/local/svn/conf: svnserve.conf /usr/local/svn/dav: /usr/local/svn/db: DB_CONFIG __db.002 __db.004 changes fs-type nodes revisions transactions __db.001 __db.003 __db.005 copies log.0000000001 representations strings uuids /usr/local/svn/hooks: post-commit.tmpl post-revprop-change.tmpl pre-commit.tmpl pre-revprop-change.tmpl start-commit.tmpl /usr/local/svn/locks: db-logs.lock db.lock Proiektua bilgunean sartzeko lehenbizi kode guztia direktorio egitura berezi batean sartu behar dugu, subversionek inportazioa ongi egin dezan. Demagun gure kodea holako direktorio batean daukagula: /home/espozmina/proiektua jakin# ls /home/espozmina/proiektua . .. proiektu1.c proiektu2.c goiburua.h Egitura berezi hori sortzeko /tmp direktorioa erabiliko dugu. Lehenbizi proiektuaren direktorio bat sortzen dugu: jakin# mkdir /tmp/proiektua jakin# Orain direktorio bereziak sortuko ditugu: jakin# mkdir /tmp/proiektua/{trunk,branches,tags} jakin# ls -f /tmp/proiektuak . .. trunk branches tags jakin# Eta bukatzeko trunk direktorioan kode guztia sartuko dugu jakin# cp -rfp /home/espozmina/proiektua/* /tmp/proiektua/trunk jakin# OK! orain inportazioa burutzeko prest gaude. jakin# svn import /tmp/proiektuak/ file:///usr/local/svn/proiektua -m "Lehen inportazioa" Adding /tmp/proiektuak/trunk Adding /tmp/proiektuak/trunk/goiburua.h Adding /tmp/proiektuak/trunk/proiektu1.c Adding /tmp/proiektuak/trunk/proiektu2.c Adding /tmp/proiektuak/branches Adding /tmp/proiektuak/tags Committed revision 1. jakin# Orain gure home-an daogena ezabatu daiteke, (edo beste izen batekin gorde) eta gure kodearekin lanean has gaitezke. Hasteko, gure kodea SVN bilgunetik aterako dugu chekckout aginduarekin; Lehenengo aldian, hasieran bezala egonen da noski. jakin# rm -rf /home/espozmina/proiektua edo jakin# mv /home/espozmina/proiektua /home/espozmina/koldarra && echo "koldarra naiz" Eta kodea ekartzen dugu: jakin# svn checkout file:///usr/local/svn/proiektua proiektua A proiektua/trunk A proiektua/trunk/goiburua.h A proiektua/trunk/proiektu1.c A proiektua/trunk/proiektu2.c A proiektua/branches A proiektua/tags Checked out revision 1. jakin# Begirada bat bota eta fitxategiak trunk barruan daude jakin# ls /home/espozmina/proiektua /home/espozmina/proiektua/: branches tags trunk /home/espozmina/proiektua/branches: /home/espozmina/proiektua/tags: /home/espozmina/proiektua/trunk: goiburua.h proiektu1.c proiektu2.c jakin# Listo, lanean has gaitezke. +---------------------+ |(2) Kodea mantentzen | +---------------------+ Orokorrean fitxategiak gehitu, kopiatu, direktorioak sortzerakoan, beti svn aginduak erabili behar dira bilgunearen edukinarekin bat etortzeko. (2.1) Aldaketak --------------- /home/espozmina/proiektua/trunk barruan dauden fitxategiekin lan egiten dugu, eta aldaketa mordoa egin ostean kodearen bertsio berria gorde dezakegu. jakin# svn commit /home/test/proiektua/trunk/proiektu1.c -m "Lehen aldaketa" Sending proiektua/trunk/proiektu1.c Transmitting file data . Committed revision 2. jakin# -m aukera erabiltzen ez bada, editorea irekiko da iruzkinak sar ditzagun. *****OHARRA**** Non egiten dugu lan? ez dugu CVSROOT aldagaiaren beharrik, fitxategiak dauden gunean lan egin dezakegu: jakin# cd proiektua/trunk jakin# svn commit proiektu1.c -m "Lehen aldaketa" Transmitting file data . Committed revision 2. jakin# (2.2) Gehitu ------------ Fitxategia berriak gehitzeko svn add agindua erabili behar da. Demagun berria.c izeneko fitxategia sortu dugula. Lehenbizi fitxategi hori gehitu behar da, hortik aitzina berdin egiten dugu lan. jakin# svn add berria.c A berria.c jakin# svn commit -m "Berria gehitu da" Adding trunk/berria.c Transmitting file data . Committed revision 5. jakin# Orain fitxategi hori egunera dezakegu bilgunean daukagulakoz jakin# svn update berria.c At revision 5. jakin# (2.3) Ezabatu ------------- Gehitzen den bezala, bilguneko elementuak ezabatu daitezke: jakin# svn del berria.c D berria.c jakin# svn commit -m "Berria ezabatuta" Deleting trunk/berria.c Committed revision 6. jakin# (2.4) Kopia ------------- Sistemako kopia egin ordez (cp), svn copy egitea komeni da. jakin# svn copy proiektu1.c kopia1.c -m "test" A kopia1.c jakin# jakin# svn commit -m "kopia burutu da" Adding trunk/kopia1.c Committed revision 8. jakin# (2.5) Berrizendatzea -------------------- Gure fitxategien izenak aldatzeko... jakin# svn move kopia1.c kopia2.c A kopia2.c D kopia1.c jakin# jakin# svn commit -m "Mugitzea burutu da Deleting trunk/kopia1.c Adding trunk/kopia2.c Committed revision 10. jakin# (2.6) Kodearen egoera --------------------- status aginduaren bitartez fitxategien egoera ezagutu dezakegu, jabea eta rebisio zenbakiak besteak beste: jakin# svn status --verbose 5 5 root . 5 1 root goiburua.h 5 3 root proiektu1.c 5 1 root proiektu2.c 10 10 root kopia2.c jakin# svn status kopia2.c --verbose 10 10 root kopia2.c jakin# Egoera kode bereziak daude commit egin ez bada: A : gehitzeko prest C : gatazka egoera D : ezabatzeko prest M : aldaketak sartu dira R : berrizendatzeko prest X : bertsiorik gabe baina subversioneseko kanpo elementua da ? : ez dago subversionen kontrolpean ! : kontr~olpean baina galduta ala datu faltarekin. ~ : gure gunean dagoena eta bilgunean dagoena ez da mota berdinekoa I : kasurik ez egiteko esan zaio (2.7) Ezberdintasunak --------------------- diff aginduaren bitartez gure kopia eta bilgunearen kodea konparatzen dira, eta ezbertasun guztiak erakusten dizkigu. Adibidez, kopia2.c fitxategian printf bat sartzen bada: jakin# svn diff Index: kopia2.c =================================================================== --- kopia2.c (revision 10) +++ kopia2.c (working copy) @@ -4,6 +4,6 @@ * * */ int main() { - +printf("Epa\n"); return 0; } jakin# Fitxategia bakar bati buruz galde daiteke: jakin# svn diff proiektu1.c jakin# Sistema honekin patch fitxategiak sor daitezke zuzenean: jakin# svn diff kopia2.c > patchfitxategia Gero patch aginduari patchfitxategia pasa al zaio softwarea konpontzeko jakin# patch -p1 < patchfitxategia 2.8 Atzerapausua ---------------- Hanka sartzen badugu atzerapausua egiteko aukera daukagu revert aginduarekin. Demagun fitxategi bat ezabatzeko prestatu dugula: jakin# svn del kopia3.c D kopia3.c Orain D marka agertuko da status-a ateratzereakoan: jakin# svn status --verbose 5 5 root . 5 1 root goiburua.h 5 3 root proiektu1.c 5 1 root proiektu2.c 11 11 root kopia2.c D 11 11 root kopia3.c jakin# Atzera jotzeko edo aldaketak bertan behera uzteko, revert: jakin# svn revert kopia3.c Reverted 'kopia3.c' jakin# jakin# svn status --verbose 5 5 root . 5 1 root goiburua.h 5 3 root proiektu1.c 5 1 root proiektu2.c 11 11 root kopia2.c 11 11 root kopia3.c jakin# 2.9 Gatazkak ---------------- Bilgunean pertsona bat baino gehiago egon daiteke lanean. Gatazkak gertatzen direnenan horiek konpondu ostean (revert erabiliz adibidez), resolve agindua erabil daiteke: jakin# svn resolved kopia3.c +---------------------+ |(3) Kodea zabaltzen | +---------------------+ SVN bilgunea atzitzeko eta kudeatzeko modu ezberdinak daude: * Modu lokalean * SVN protokoloaren bitartez * HTTP/HTTPS bitartez * SSH bitartez SVN aginduak kanpo bilguneak atzitzeko horrelako itsura dauka: jakin# svn checkout svn://svn.zerbitzaria.eh/proiektua/trunk Dump & Load --------------------- Bilgune guztiaren dump bat egin daiteke kanpo bilgune batean kargatzeko. Hasteko svn bilgunearen "zuhaitza" irauli behar da: jakin# svnadmin dump /home/test/proiektua > proiektua.dump Orain proiektua.dump fitxategia kanpo makinara mugitu. Modu apropos bat scp edo sftp aginduak erabiltzea litzateke. jakin# scp proiektua.dump loginizena@svn.zerbitzaria.eh:/home/loginizena Behin fitxategia mugituta, kanpo makinan sartu eta load bat egin behar da: svn.zerbitzaria.eh# svn load /usr/local/svn/proiektua < proiektua.dump (3.1) SSH bitartez ------------------ Proiektuaren kodea zifratuta joateko SSH protoloa gehitu dezakegu. Adibidez checkout bat egiteko: Hasteko SVN_SSH aldagaia ezarri behar da: jakin# export SVN_SSH="ssh -l loginizena" SSH eta SVN protokoloak batuz checkout bat egin... jakin# svn checkout svn+ssh://svn.zerbitzaria.eh/svnroot/repos/proiektua/trunk Eta hortik aurrera proiektua direktorio lokalean sartu eta svn aginduak erabili daitezke. Import bat ere egin daiteke: jakin# svn -m "import ssh bitartez" import \ svn+ssh://svn.zerbitzaria.eh/svnroot/repos/proiektua/trunk (3.2) Web bitartez ------------------ SVN bilgunea web bitartez atzitu daiteke http edo https moduan jakin# svn checkout http://svn.zerbitzaria.eh/proiektua/trunk Hortik aurrera, direktorio lokalean sartu eta svn aginduak erabili daitezke normaltasun osoz: jakin# cd proiektua jakin# svn status https -------- https protokoloa ere erabili daiteke, adibidez import bat burutzeko: jakin# cd importatu_nahi_dudan_proiektuaren_direktorioa jakin# svn -m "import https bitartez" import \ https://loginizena@svn.zerbitzaria.eh/svnroot/repos/proiektua/trunk Non loginizena sv.zerbitzaria.eh-ren erabiltzailea den. Checkout bat adibidez: jakin# svn checkout https://loginizena@svn.zerbitzaria.eh/svnroot/repos/proiektua/trunk +Azken oharra: Kodean $Id$ estiloko gakoak sartzen direnean svn-k datuekin ordezkatzen ditu; data, egilea, bertsio zenbakia,... Gakoak ez ditu ordezkatzen? Besterik ezean subversionek ez ditu ordezkapenik egiten. svn ps svn:keywords "Id Author" proiektua/*.c Hauxe izan da dena. Honekin nahikoa izan daiteke zure proiektuak, kodea, dokumentazioa edo dena delakoa hobeto gordetzeko. Sourceforge bezalako guneen erabiltzaile bazara ezinbestekoa izanen duzu. Bertan SVN-ri buruzko informazio gehiago topa dezakezu. Hurrengora arte! -Espoz&Mina-