Správa verzí Luboš Pavlíček
Cíle správy verzí místo, kde jsou uloženy různé verze souborů, historické verze - revize dle platformy/zákazníka - varianty sdílení kódu mezi vývojáři a mezi počítači zdroj pro sestavení aplikací, zdroj pro "manažerské" statistiky, 1. přednáška - správa verzí
vývoj revizí včetně vytvoření jedné samostatné větve (branch) Lokální správa verzí víceuživatelské systémy s terminály, sdílený diskový prostor, SCCS (1972), rcs (1982), 1.1 1.2 1.3 2.1 2.2 1.3.1 vývoj revizí včetně vytvoření jedné samostatné větve (branch) 1. přednáška - správa verzí
Centralizovaná správa verzí úložiště/ repository server x desktop Alice - pracovní adresář (workspace) Bob - pracovní adresář (workspace) Joel - pracovní adresář (workspace) 1. přednáška - správa verzí
Centralizovaná správa verzí CVS – Concurent Version System (1990), nadstavba na rcs, Subversion (2000), Rational ClearCase (1992), Visual SourceSafe (1994), Perforce (1995), Team Foundation Server (2005), ... komerční 1. přednáška - správa verzí
Decentralizovaná správa verzí centrální úložiště/ repository server Joel repository Alice repository Bob repository desktop x Alice - pracovní adresář (workspace) Bob - pracovní adresář (workspace) Joel - pracovní adresář (workspace) 1. přednáška - správa verzí
Distribuovaná správa verzí výhody lze definovat více variant workflow, vývojáři obvykle dělají lokální commity po menších změnách, snazší vytváření větví, není single-point-of-failure, rychlejší přístup pro některé operace, nevýhody složitější, jedno úložiště = jeden projekt, 1. přednáška - správa verzí
Decentralizovaná správa verzí BitKeeper (1998), Darcs (2002), Bazaar (2005), Git (2005), Mercurial (2005), 1. přednáška - správa verzí
Základní operace stažení poslední verze z úložiště, stažení „starší“ verze z úložiště, odeslání změn na server, zobrazení souborů z konkrétní revize, zobrazení rozdílů mezi verzemi souborů, slučování změn od více uživatelů (merge) a řešení kolizí, vytváření a slučování větví, 1. přednáška - správa verzí
Zjišťování změn v pracovišti před odesláním změn do úložiště musí uživatel označit přidané/odebrané soubory/adresáře, IDE většinou označují za uživatele, některé soubory se nepřenášejí do úložiště !!! předdefinové v klientech: *.bak, *.*~, *.*# lze rozšířit přes property svn:ignore vhodné *.class, *.ctxt 1. přednáška - správa verzí
Revize revize – verze souboru či stavu projektu* v čase, číslování revizí: každý soubor nezávisle (CVS), globální číslování jednotlivých změn v úložišti (Subversion), kryptografickým otiskem celého stavu projektu (Git, Mercurial), *) pro stav projektu se používá pojem changeset 1. přednáška - správa verzí
Značky (tags) Značka (tag) – důležitý milník, stav konfigurace v určitém čase, např. subversion-1.7.7 revize: 1393927 subversion-1.7.8 revize: 1419826 pmd-releases/4.3 0d3cba2a2e (5611) pmd-releases/5.0.0 8dcde0edb5 (6736) pmd-releases/5.0.1 6a8d7c3bcc (6862) Git 1. přednáška - správa verzí
Větvení každý projekt obvykle má: Kmen (trunk) – hlavní vývojová linie, Větve (branches) – paralelní vývojová linie, 1. přednáška - správa verzí
Workflow – organizace práce jak se pracuje s větvemi, jak začlenit změny od jednotlivých vývojářů, vývojář sám na jednom počítači, vývojář sám na více počítačích, více vývojářů rovnocenných přístupem, jeden/několik vývojářů schvaluje příspěvky od ostatních, stabilní a vývojová větev, větve pro jednotlivé klienty, větvení pro překladatele, ... 1. přednáška - správa verzí
x úložiště (repository) pevný bod server desktop Alice - pracovní adresář (workspace) Bob - pracovní adresář (workspace) Joel - pracovní adresář (workspace) 1. přednáška - správa verzí
Subversion nástupce CVS nové možnosti: přejmenování, verzování adresářů, atomický commit, binární diff, možnost přístupu přes webdav (přístupová práva), způsob práce a příkazy podobné CVS © Luboš Pavlíček 1. přednáška - správa verzí
SVN: nástroje TortoiseSVN příkazová řádka, samostatné integrované do vývojového prostředí Eclipse, NetBeans, ... správa přes web, statistiky např. chora, websvn, wsvn, integrace do nástrojů pro sestavování ant, Hudson, .... © Luboš Pavlíček 1. přednáška - správa verzí
Struktura úložiště pro uživatele emuluje strukturu adresáře, v úložišti může být více projektů, globální číslování revizí, větve, značky: vytvořením podadresáře vhodného jména, obecná operace copy, © Luboš Pavlíček 1. přednáška - správa verzí
Struktura úložiště / adventura trunk tags verze 0.1 verze 0.2 pexeso trunk tags branches verze 0.1 verze 0.2 verze 0.3 Hra.java Vec.java Mistnost.java TextoveRozhrani.java © Luboš Pavlíček 1. přednáška - správa verzí
Pracoviště - workspace počítač vývojáře úložiště c:\svn pexeso adventura trunk tags branches / pexeso adventura trunk tags branches © Luboš Pavlíček 1. přednáška - správa verzí
Pracoviště - workspace ve skrytém adresáři .svn jsou: adresa úložiště, číslo revize, ... verze souborů stažené z úložiště , běžné adresáře: v něm dělá uživatel úpravy, tj. obsahuje aktuální verze souborů, mohu promíchat pracoviště dvou projektů? © Luboš Pavlíček 1. přednáška - správa verzí
Operace mezi pracovištěm a úložištěm check-out – vytvoří lokální pracoviště a zkopíruje obvykle poslední revizi z úložiště, update – aktualizuje se lokální pracoviště na poslední verzi v úložišti, commit (check-in) – odeslání změněných prvků/souborů do úložiště, export import svn nefunguje jako dropbox – nic automaticky nepřenáší © Luboš Pavlíček 1. přednáška - správa verzí
Operace na pracovišti i úložišti I add – začlenění souboru/adresáře delete – smazání souboru či adresáře mkdir – vytvoření adresáře move – přesun/přejmenování souboru copy (branch/tag) – vytvoření kopie souboru/adresáře na pracovišti či v úložišti, též vytvoření větve či značky proplist, propset, propdel – správa vlastností (properties), musíte svn říct, že přibyl/ubyl soubor/adresář ? © Luboš Pavlíček 1. přednáška - správa verzí
úložiště projekt 1 projekt 2 kmen kmen kmen kmen en značka 1 značka 2 počítač 1 počítač 2 kmen kmen en pracoviště pracoviště
Operace na pracovišti i úložišti II revert – vrácení úprav na pracovišti, pomocí revert se vrátím ke stavu souboru z revize (z posledního update). checkout vybrané revize – chci starší revizi, cleanup – oprava pracoviště do stabilního stavu po nedokončených operacích, - někdy cleanup nepomůže: smazat „pracoviště“ a udělat nový checkout, © Luboš Pavlíček 1. přednáška - správa verzí
Konflikty – přístup Copy-Modify-Merge 1 Dva uživatelé si zkopírují soubor Oba soubor editují A A A A A’ A” Harry Sally Harry Sally Sally odešle změny na server Harry má smůlu - A” A” commit commit X A’ A” A’ A” © Luboš Pavlíček 1. přednáška - správa verzí Harry Sally Harry Sally
Konflikty – přístup Copy-Modify-Merge 2 Harry provede update Harry sloučí soubory (merge) A” A” update A’ A” A” A* A” Harry Sally Harry Sally Harry odešle sloučenou verzi Sally si též zaktualizuje V subversion se po sloučení A* A* commit update A* A” A* A* © Luboš Pavlíček 1. přednáška - správa verzí Harry Sally Harry Sally
Konflikty - Copy-Modify-Merge 3 při operacích update a commit, více souborů po update: ručně vyřešit konflikt do souboru "Hra.java„ (merge) resolve – nastavení příznaku, že konflikt vyřešen, commit update Hra.java - správná verze Hra.java.mine - moje úpravy Hra.java.r1 - počáteční stav u mne Hra.java.r2 - stav v úložišti © Luboš Pavlíček 1. přednáška - správa verzí
© Luboš Pavlíček 1. přednáška - správa verzí
Operace na pracovišti i úložišti III lock – nastavení zámku, unlock – zrušení zámku, optimistický zámek lze editovat bez získání zámku, nelze provést commit, pokud někdo jiný má zámek, pesimistický zámek bez získání zámku nelze provést žádné úpravy, k souborům s požadavkem na pesimistický zámek se nastavuje vlastnost (property) svn:needs-lock distribuované systémy na správu verzí nepodporují zámky, © Luboš Pavlíček 1. přednáška - správa verzí
Konflikty – použití zámků (lock) Dva uživatelé si zkopírují soubor Harry požádá o zámek A A LOCK A A A A Harry Sally Harry Sally Sally požádá o zámek Harry odešle a odemkne Při commitu se automaticky uvolňuje zámek A A’ LOCK commit X UNLOCK A’ A A’ A © Luboš Pavlíček 1. přednáška - správa verzí Harry Sally Harry Sally
Properties - vlastnosti pro adresář/soubor lze nastavovat properties, které ovlivňují chování klienta svn © Luboš Pavlíček 1. přednáška - správa verzí
Property svn:ignore – ignorovat soubory seznam souborů, které se nemají přenášet do úložiště, např. Thumbs.db *.class *.ctxt klienti mají v sobě obvykle zabudovaný předpis, jaké soubory mají ignorovat – každý klient různý © Luboš Pavlíček 1. přednáška - správa verzí
Property svn:keywords používají se následující keywords: Date, Revision, ID, Author, URL, Header v souboru „Pokus.java“ je použijete: nastavíte property svn:keywords pro soubor „Pokus.java“ na “Date Author” provedete commit: Author of last commit: $Author$: Date of last commit : $Date$: Author of last commit: $Author: pavlicek $: Date of last commit : $Date: 2009-09-21 14:17:57 +0200 (po, 21 IX 2009) $: © Luboš Pavlíček 1. přednáška - správa verzí
Protokoly, KITSCM.VSE.CZ © Luboš Pavlíček 1. přednáška - správa verzí
Přístup k úložišti svn - protokoly přes protokol http/https https://kitscm.vse.cz/svn/user/pavlicek přes speciální protokol svnserve (tcp/3690) svn://host.example.com/project1 přímo na souborovém systému (file:) file:///var/svn/user/pavlicek kombinace ssh+file svn+ssh://host.example.com/repos/project © Luboš Pavlíček 1. přednáška - správa verzí
kitscm – přístup k úložištím úložiště pro jednotlivce úložiště pro projekty a skupiny https://kitscm.vse.cz/svn/user/uživ_jméno/ https://kitscm.vse.cz/svn/user/xabcd01/ https://kitscm.vse.cz/svn/user/pavlicek/ https://kitscm.vse.cz/svn/user/pavlicek/adventura/trunk https://kitscm.vse.cz/svn/proj/4it115_po_0915_p_109 https://kitscm.vse.cz/svn/proj/4it251_po_1245_p_107 https://kitscm.vse.cz/svn/proj/pexeso/ https://kitscm.vse.cz/svn/proj/clovece_nezlob_se/ © Luboš Pavlíček 1. přednáška - správa verzí
Subversion - verze hlavní verze svn nejsou zpětně kompatibilní, automatická konverze na novou strukturu, pokud máte pracoviště ve verzi 1.6, tak po přístupu klientem 1.7 se změní struktura pracoviště. Klient verze 1.6 již nemůže přistupovat k pracovišti. klient verze svn (řádkový klient) 1.8 NetBeans 7.2.1 a novější 1.7 NetBeans 7.4 a novější 1.8 s klientem Subclipse 1.10 (pro Eclipse) Intellij IDEA 13 a novější TortoiseSVN (GUI pro windows) © Luboš Pavlíček 1. přednáška - správa verzí
Nejčastější chyby odeslání změn jen v části projektu, chybí odvaha vyřešit kolize, jména souborů/adresářů: v úložišti se rozlišují malá/velká písmena, nelze stáhnout do Windows !!! © Luboš Pavlíček 1. přednáška - správa verzí
Více projektů v úložišti / adventura pexeso trunk tags branches verze 0.1 verze 0.2 verze 0.3 / trunk branches adventrua pexeso adventura verze 0.1 verze 0.2 tags trend posledních let: jedno úložiště == jeden projekt © Luboš Pavlíček 1. přednáška - správa verzí
Rozdílové informace, úspora místa © Luboš Pavlíček 1. přednáška - správa verzí
Ukládání informací na serveru snaha o úsporu místa, pokud se soubor mezi revizemi nezmění, neukládá se nová kopie, komprimace souborů, obsahově adresovatelný systém souborů, ukládání pouze rozdílů mezi revizemi 1. přednáška - správa verzí
Uložení rozdílových informací 1 Weave (tkanina) ukládají se jednotlivé řádky a čísla revizí, ve kterých se nachází, používá se v SCCS, pomalé, lze snáz a lépe automatizovat merge, Z 4 A 1, 2, 3, 4 X 2 B 1, 2, 3, 4 Y 3 A B A X B A B Y Z A B vývoj řádek v souboru uloženo v souboru v úložišti 1. přednáška - správa verzí
Uložení rozdílových informací 2 Delta rozdíly mezi dvěma verzemi souboru, různé algoritmy (diff, xdelta, zdelta, …), public class Hello { public static void main(String [] args) { System.out.println("Hello world"); } public class Hello { public static void main(String [] args) { System.out.println("Ahoj svete"); } V úložišti je počáteční verze souboru a poté rozdílové soubory mezi jednotlivými verzemi. 3c3 < System.out.println("Hello world"); --- > System.out.println("Ahoj svete"); 1. přednáška - správa verzí Rozdílový soubor z programu diff
Git, Mercurial nepoužívají se rozdílové soubory, ke každému souboru se počítá otisk (hash) SHA1 pokud v cíli je soubor se stejným otiskem, tak se nepřenáší, neukládá podruhé, uloží se pouze metainformace, 1. přednáška - správa verzí
Literatura Pilato C.M., Collins-Sussman B., Fitzpatrick B.W.: Version Control with Subversion. On-line na svnbook.red-bean.com http://revctrl.org/ Chacon, S.: „Pro Git“. česká verze on-line na knihy.nic.cz © Luboš Pavlíček 1. přednáška - správa verzí