Verziókezelés
Download
Report
Transcript Verziókezelés
Verziókezelés
Verziókezelő rendszerek
Kulcsszavak
Verziókezelés
Revision Control, Version Control, Source
Control, Source Code Management (SCM)
Verziókezelő rendszerek
Version Control System (VCS)
Distributed Revision Control (DRCS)
Verziókezelés
Verziókezelés alatt több verzióval rendelkező
adatok kezelését értjük. Leggyakrabban a mérnöki
tudományokban és a szoftverfejlesztésben
használnak verziókezelő rendszereket fejlesztés
alatt álló dokumentumok, tervek, forráskódok és
egyéb olyan adatok verzióinak kezelésére,
amelyeken több ember dolgozik egyidejűleg. Az
egyes változtatásokat verziószámokkal vagy
verzióbetűkkel követik nyomon.
Példa (Horde repository)
Példa (Horde README revision)
Példa (README Annotation)
Példa (Google Docs)
Felhasználási területek
Elsősorban többszemélyes projektek esetében.
A legtöbb verziókezelő rendszert szoftverfejlesztési
projektekben használták először, de egyes
szövegszerkesztők, táblázatkezelők és egyes
tartalomkezelő szoftverek is támogatják.
A beépített verziókezelés a wiki szoftvereknél is
kulcsfontosságú. A wiki rendszerek integrált verziókezelői
teszik lehetővé, hogy a felhasználók nyomon követhessék
egymás szerkesztéseit, és visszaállíthassanak oldalakat
azok korábbi verzióira, ezzel védekezve a vandalizmus és a
spam ellen.
Alapjellemzők
Definíció: a szoftver megépítéséhez
szükséges források és más fájlok tárolása és
megosztása
Biztonságosan
Ellenőrzött hozzáféréssel
A fájlok legújabb illetve korábbi
változatainak megőrzésével
Alapjellemzők: biztonság
Megbízható hardver (pl. RAID) –
diszkhibák ellen
Rendszeres mentés, archiválás (Disaster
recovery)
A fejlesztés történetének teljes rögzítése
Verziók azonosítása
Fejlesztői/kooperációs hibák ellen
Új verziók és javítások párhuzamos
fejlesztéséhez
Alapjellemzők: ellenőrzött
hozzáférés
Felhasználó-azonosítás
A változtatások névhez köthetők legyenek
A vétett hibák névhez köthetők legyenek
Jogosultságok bevezetése, védelem
Konkurencia-kezelés
Fájl szinten (párhuzamos módosítások)
Alkalmazás logikai szintjén (konzisztens
állapotok, mérföldkövek megkülönböztetése)
Kezelési modellek
Központosított modell (hagyományos):
minden verziókezelési művelet egy közösen
használt szerveren történik
Elosztott verziókezelő rendszerek: minden
felhasználó gépe egy-egy külön tárolóként
jelenik meg.
Példa: Központi verziókezelő
Alapműveletek
Lokális munkamásolat készítése (checkout)
Lokális másolat frissítése (update)
A lokális példány is már változhatott addigra!
Változások megtekintése, elemzése (log,
diff, status)
Változások visszaírása a repositoryba
(commit, checkin) Ez az egyetlen írási
művelet a repository felé!
Központosított modellek
Probléma: ha két, vagy több fejlesztő
egyidejűleg próbálja módosítani ugyanazt a
fájlt. Az ilyen (centralizált) rendszerek
kétféleképpen oldják meg ezt a problémát
(concurrency modell): lock-olással és
merge-eléssel.
Lock modell(zárolás): Előnyök, hátrányok
Merge modell (összefésülés)
Elosztott rendszerek
Nincs nagy központi adatbázis, csak
munkamásolatok (working copies).
A gyakori műveletek gyorsak, mert nem
kell központi szerverrel kommunikálni.
Minden munkamásolat egy-egy távoli
backup, ami természetes védelmet ad az
adatvesztés ellen.
Központi vs. elosztott
Központi vs. Elosztott
Központi vs. Elosztott konklúzió
A központi: egyszerű, kiváló backup, undo,
szinkronizáló műveletekre.
Elosztott: a valós élethez közelebb áll,
összefésülés, elágazásra alkalmasabb, nem
igényel folyamatos online jelenlétet, csak a
változások megosztásánál. Sokkal gyorsabb
nagy projekteknél, sok változtatás esetében,
cserébe nehezebb menedzselni központilag.
Nyitott rendszer (open system)
Minden munkamásolat gyakorlatilag egy ág.
(branch)
Minden ág egy-egy munkamásolatként
implementálódik. Az ágak összefésülés patch-ek
küldözgetésével történik.
Lehet válogatni az egyes változtatások között,
nem kell feltétlenül minden változtatást letölteni.
Új tagok bármikor csatlakozhatnak a rendszerhez,
nincs szükség szerveroldali regisztrációra.
Példa egy projektre
Trunk: a fejlesztés fő vonala (baseline,
mainline), jóváhagyott változata
Branch: elágazás, párhuzamosan
fejlesztett változat
Tag: a fájlokhoz adott időpillanatban,
adott ponton rendelt címke (label), ami a
verziószámot jelöli (beszédesen, vagy
számokkal).
Műveletek, fogalmak
Import: lokálisan tárolt adathalmaz, amely még
nem munkamásolat, felmásolása a tárolóra és
verziókontroll alá helyezése.
Export: hasonlít a checkout-hoz, de metaadatok
nélküli tiszta publikálás.
Change, change list: a verziókezelt dokumentum
változtatásai
Conflict: a változások összefésülésének
problémája
Merge (összefésülés) szüksége
Ha egy felhasználó módosítja a saját
munkamásolatát, majd letölt a szerverről egy
másik módosított változatot. Ekkor a szerveren
lévő változásokat össze kell fésülni a lokális
munkapéldány változásaival a kliensen.
Ha a fejlesztésben elágazás történt, majd egy hibát
kijavítottak valamely ágban, s a javítást
alkalmazni kell a másik ágra is.
Ha a fejlesztésben elágazás történt, majd az ágakat
különböző irányba fejlesztettek tovább, s a
különböző fejlesztéseket össze kell vonni egy
közös változatba (trunk-ba).
Verziókezelő rendszerek
csoportosítási szempontjai
Repository modell szerint (központi,
elosztott)
Támogatott platformok (Linux, Windows,..)
Költsége (ingyenes, fizetős, illetve licensze)
History modell (changeset, patch, snapshot)
Verzió-azonosító (Revision ID: namespace,
sequence, pseudorandom)
Hálózati protokoll (http, https, ftp,sftp,ssh)
Aktív verziókövető rendszerek
Bazaar (ingyenes, elosztott)
Bitkeeper (utóbb fizetős, elosztott)
CVS (ingyenes, központi, egyik legrégebbi)
Subversion (SVN) (ingyenes, központi)
Visual SourceSafe (Microsoft, shared folder
alapú, fizetős)
Subversion
Általános, ingyenes CMS eszköz,
changeset, snapshot alapú tárolás (csak a
változást tárolja)
Többféle hálózati konfiguráció
Egygépes környezetben - file://
Kliens-szerver környezetben
Subversion
Támogatja:
Atomi commit
Fájl átnevezés
Szimbolikus linkek
Események pre/post kapcsolása
Unicode fájlok támogatása
Idegen repositoryk beágyazása
Részleges checkout/clone
Subversion telepítése
Csomagból
Linux (Debian, Ubuntu) : apt-get install
subversion
Windows
•
•
•
•
CollabNet
Tigris.org
SlikSVN (32, 64 bit kliens)
VisualSVN (szerver és kliens)
Forrásból
A Subversion bemutatása egy
példán keresztül
Két projekt létrehozása: egy induló, üres
projekt (MyProject1) és egy létező
(MyProject2).
Cél: a meglévő projektek verzió kontroll
felügyelet alá helyezése, illetve új projektek
készítése az eszköz használatával
A struktúrák kialakítása
SVN repository kialakítása:
cd /devdirs
mkdir svnlayout
mkdir svnlayout/{trunk,branches,tags}
SVN adatbázis, projektkönyvtár
létrehozása:
mkdir {svnrepos,projects}
Tárolók létrehozása
(svnadmin create)
mkdir
{svnrepos,projects}/{MyProject1,MyProject2}
svnadmin create --fs-type fsfs
svnrepos/MyProject1
svnadmin create --fs-type fsfs
svnrepos/MyProject2;
Használható protokollok
Protokoll
file:///
http://
https://
svn://
svn+ssh://
Elérési mód
Elérés közvetlenül a helyi fájlrendszeren
keresztül
Elérés WebDAV-on keresztül
Elérés SSL titkosítással ellátott
WebDAV-on keresztül
Elérés az SVN saját protokollján
keresztül
Elérés az SVN saját protokollján, SSH
titkosított csatornán keresztül
Struktúra létrehozása
cd svnlayout
svn import .
file:///devdirs/svnrepos/MyProject1 --message
'Struktura letrehozasa‘
svn import .
file:///devdirs/svnrepos/MyProject2 --message
'Struktura letrehozasa'
Tárolók feltöltése és
használatba vétele (svn import)
cd /path/to/projectdir
svn import .
file:///devdirs/svnrepos/MyProject2/trunk -message 'Mar kesz fajlok beimportalasa‘
cd /devdirs/projects/MyProject1
svn checkout
file:///devdirs/svnrepos/MyProject1 .
cd /devdirs/projects/MyProject2
svn checkout
file:///devdirs/svnrepos/MyProject2 .;
Revision
Svn-ben a fájlok változatait úgy nevezett
revision numberrel azonosíthatjuk. Minden
revision egyértelműen meghatározza
minden fájl állapotát, tartalmát. A revision
number minden commit után eggyel
növekszik. Ez a szám az egész repositoryra
vonatkozik, ellenben a CVS-sel, ami
minden fájlt külön-külön számoz. Ez
megkönnyíti egy-egy régebbi verzió
megtalálását.
Revision elérése
svn <cmd> -r <revision number
Tartomány megadása (kettősponttal elválasztva):
svn <cmd> -r <revison number
1>:<revision number 2
HEAD
BASE
COMMITED
PREV
{dátum}
Revision példák
svn diff -r BASE:HEAD
svn diff --revision PREV:COMMITTED foo.c
svn checkout --revision {"2009-02-17 15:30"}
svn log --revision {2009-11-20}:{2009-11-29}
Alapvető munka ciklus #1
Módosítás előtt a legfrissebb változat kérése:
svn update
Változtatások elvégzése:
svn add
svn delete
svn copy
svn move
Alapvető munka ciklus #2
Történt változás azóta a repositoryban?
svn update
Ha szükséges, vonjuk vissza a változtatásaink
svn revert
Szüntessük meg a konfliktusokat (olvasszuk be
mások változtatását)
svn update
svn resolved
Commitoljuk a változtatásainkat
svn commit
Working copy létrehozása
(svn checkout)
svn checkout
http://example.org/svn/MyProject1
/home/user/dev/MyProject1
File hozzáadása (svn add)
svn status
? first.file
svn add first.file
A first.file
svn commit -m 'first.file file hozzaadása';
Transmitting file data . Committed revision 2.
File törlése (svn del)
touch second.file
svn add second.file
A second.file
svn commit -m 'second.file hozzaadasa‘
Adding second.file Transmitting file data ..
Committed revision 3.
svn del second.file
D trunk/second.file
svn ci -m 'second.file torlese‘
Deleting trunk/second.file
Committed revision 4.
File áthelyezése, átnevezése
(svn mv)
svn mv first.file first-moved.file
A first-moved.file
D first.file
Helyi változtatások visszavonása
(svn revert)
svn st
M first.file
D second.file
svn revert tmp.file
Reverted 'second.file'
svn st M first.file
Szerveren lévő változások
letöltése (svn update)
svn update
U first.file
Updated to revision 8.
Branch létrehozása
svn cp file:///devdirs/svnrepos/MyProject1/trunk
file:///devdirs/svnrepos/MyProject1/branches/branch1
-m 'branch1 letrehozasa'
Committed revision 13.
cd ..
svn up
A branches/branch1
A branches/branch1/first.file
A branches/branch1/second.file
Updated to revision 13.
Összeolvasztás (svn merge)
svn merge -r 13:HEAD
file:///devdirs/svnrepos/MyProject1/branches/branch1
U svn-howto.wiki
svn ci -m 'branch1 beolvasztasa a fejlesztoi agba'
Sending trunk/svn-howto.wiki
Transmitting file data .
Committed revision 15.
svn log --stop-on-copy
Összeolvasztás #2
svn log --stop-on-copy
r30 | ennevem | 2009-11-19 13:33:34
+0100 (Thu, 19 Nov 2009) | 2 lines
branch1 utolso commitja
r22 | ennevem | 2009-11-19 10:33:34
+0100 (Thu, 19 Nov 2009) | 2 lines
branch1 letrehozasa
Összeolvasztás #3
svn merge -r 21:30
file:///devdirs/svnrepos/MyProject1/branches/
branch1
svn merge -r 13:14
file:///devdirs/svnrepos/MyProject1/trunk
cd
/devdirs/projects/MyProject1/branches/branch
1/
svn merge -r 12:13
file:///devdirs/svnrepos/MyProject1/trunk/file1
file1
Összeolvasztás #4
cd
/devdirs/projects/MyProject1/branches/branch
1/
svn merge -c 13
file:///devdirs/svnrepos/MyProject1/trunk/
Tag létrehozása
svn cp
file:///devdirs/svnrepos/MyProject1/trunk
file:///devdirs/svnrepos/MyProject1/tags/
tag1 -m 'tag1 letrehozasa'
Visszatérés korábbi verzióhoz
svn merge -c -17
file:///devdirs/svnrepos/MyProject1/trunk
U svn-howto.wiki
svn st
M first.file
svn ci -m 'undoing change committed 17‘
Sending trunk/first.file
Transmitting file data.
Committed revision 18.
Visszatérés korábbi verzióhoz #2
svn merge -r 19:16
file:///devdirs/svnrepos/MyProject1/trunk
U first.file
Törölt fájl visszaállítása
repositoryból
svn copy -r 14
file:///devdirs/svnrepos/MyProject1/trunk
/deleted.file ./deleted.file
Fájlok, könyvtárak figyelmen
kívül hagyása
svn propset svn:ignore second.file .
property 'svn:ignore' set on '.'
svn propset svn:ignore '*' tempfiles/
Konfliktusok kezelése
svn up
C first.file
Updated to revision 22.
ls -1
first.file
first.file.mine
first.file.r21
first.file.r22
Konfliktusok kezelése #2
svn ci -m 'try to commit'
svn: Commit failed (details follow):
svn: Aborting commit:
'/devdirs/projects/MyProject1/trunk/first.file' remains
in conflict
Lehetőségek:
Kézzel összeolvasztjuk a konfliktusban érintett fájlokat
Az egyik ideiglenes fájllal felülírjuk a munkafájlunkat
Futtatjuk az svn revert <filename> parancsot, amivel az
összes változtatásunkat visszavonjuk
Konfliktusok kezelése #3
svn resolved first.file
Resolved conflicted state of 'first.file'
Kézi összeolvasztás
cat first.file
1. sor
2. sor
3. sor
4. sor
<<<<<<< .mine
John 5. sor
John 6. sor
John 7. sor
=======
Joe 5. sor
Joe 6. sor
Joe 7. sor
>>>>>>> .r25
Kézi összeolvasztás #2
svn resolved first.file
Resolved conflicted state of 'first.file‘
svn ci -m 'A sajat (John) modositasaink
beolvasztasa Joe sorai ele'
Sending first.file
Transmitting file data .
Committed revision 26.
Saját verziónk kikényszerítése
svn up
C first.file
Updated to revision 30.
ls first.file*
first.file first.file.mine first.file.r29 first.file.r30
cp first.file.r30 first.file
svn resolved first.file
Resolved conflicted state of 'first.file'
Szerveren lévő verzió elfogadása
svn revert <filename>
Változások visszakövetése
(svn log) #1
svn log
r34 | ajnasz | 2009-08-16 00:43:21
+0200 (cs, 16 aug 2009) | 1 line
konyvtarstruktura kiegeszitesek
r33 | ajnasz | 2009-08-12 18:21:12
+0200 (v, 12 aug 2009) | 1 line typo,
formazasok
Változások visszakövetése #2
svn log -r 10:20
svn log -r 20:10
svn log -r 23
svn log -r HEAD
Változások visszakövetése #3
svn log trunk/svn-howto.wiki
svn log http://example.com/svn/file.c -r
HEAD
Módosítások soronkénti
áttekintése (svn diff)
svn diff first.file
Index: first.file
--- first.file (revision 43)
+++ first.file (working copy)
@@ -511,7 +511,7
@@
Lorem ipsum dolor
- modositas
+ Módosítás
Lipsum
Lorem ipsum
Módosítások soronkénti
áttekintése #2
svn diff -r 40:42 first.file
svn di
http://example.com/svn/trunk@10
http://example.com/svn/trunk@12
Patch készítése
svn di > patch.file
Working copy helyének
megváltoztatása (svn switch)
svn switch --relocate
http://example.com/regihely
http://example.com/ujhely .
Felhasználókezelés
[general]
anon-access = read
auth-access = write
password-db = jelszo_allomany
[USERS] felhasznalo = jelszo
Parancsokról röviden
svn status
svn update
svn commit
svn add
svn delete
svn revert
svn diff
Rövidítések
svn commit = svn ci
svn checkout = svn co
svn status = svn st
svn update = svn up
svn diff = svn di
svn delete = svn del vagy svn rm
svn move = svn mv
svn copy = svn cp
svn list = svn ls
svn switch = svn sw