CVS - Systém pro správu verzí

Aktuální informace

10.11.1998: Objevili jsme s Králíkem nemilou zradu: Pokud budete chtít updatovat dokumentaci projektu na atreyi, je nutné, aby na počítači vidla byl atrey uveden v souboru ~/.ssh/known_hosts. Věc poměrně zřejmá se změní v nepříjemnou zradu ve chvíli, kdy update provádíte ze stroje mimo vidlu, tak na to nezapomeňte. Nevadí, že nevlastníte konto na atreyi, jen se pokuste o nalogování z vidly a nechte ssh, ať přidá atreye do patřičného souboru.

21.10.1998: CVS strom je vytvořen na počítači vidla.kolej.mff.cuni.cz, v adresáři  /home/projekt/cvs. Zatím se v něm nachází jen pár testovacích souborů, podadresář sources (v něm bude strom zdrojáků) a docs (v něm budou - inu - dokumenty). Správa dokumentů je mírně automatizovaná: při každém checkoutu v adresáři docs se spustí skript, který všechny dokumenty *.html z tohoto adresáře překopíruje do adresáře pro publikaci na WWW - aktuálně je to URL http://atrey.karlin.mff.cuni.cz/~lisak/projekt. Kopírování nebere v potaz případné podadresáře.
Každý účastník projektu má svou defaultní grupu nyní nastavenou na projekt. Pokud by se to někomu zajídalo, ať mi dá vědět, ale takhle jste ušetřeni neustálého chgrp. Nezapomeňte si změnit umasku na 002, ať můžou ostatní pokračovat v tom, co napíšete.


Principy

CVS slouží ke správě verzí a organizaci vývoje projektu. Zajišťuje zejména:
  1. Ukládání a organizaci všech verzí všech souborů (revisions) a verzí kompletního projektu (releases). Ke každé změně v souborech je možné připsat konemtář, čeho se změna týkala. Udržuje se historie změn, ve které je uvedeno, kdo a kdy kterou změnu provedl
  2. V kterékoli fázi vývoje umožňuje návrat k předcházejícím revizím a/nebo releasům (užitečné při dohledávání chyb).
  3. Umožňuje rozštěpit vývoj na několik větví a spravovat kadou z nich samostatně.
  4. Do jisté míry brání i konfliktům při práci v týmu (podrobněji viz  Práce v týmu).
O co se nám CVS nepostará:
  1. O korektnost ukládaných souborů. CVS slouží jen k organizaci práce, neprovádí žádnou kontrolu na chyby, ani syntaktické (přestože umí spolupracovat s externími programy, které si toto vezmou na starost). Kadá verze, kterou se vývojář rozhodne přidat do databáze by měla být v každém případě zkompilovatelná a ještě lépe funkční. Pokud funkčnost nejde v daném okamiku zajistit, je třeba to zdůraznit v komentáři k verzi.
  2. O dokumentaci projektu. Poznámky a případná symbolická čísla verzí slouží jen k orientaci. Významněší změny v kódu je třeba dokumentovat zvlášť
  3. O komunikaci mezi vývojáři: CVS se dá nakonfigurovat tak, aby v případě změny hlídaných souborů informoval vybraný okruh vývojářů, že se na daném souboru/modulu pracuje, ne vdžy to však stačí. Pokud vznikne konflikt mezi dvěma verzemi, je potřeba domluvy obou zkonfliktěných členů.

Práce s CVS

Organizace souborů v CVS

CVS ukládá veškeré potřebné soubory v adresářové struktuře (v našem případě) na vzdáleném počítači (vidla.kolej.mff.cuni.cz). Kadý vývojář před začátkem práce požádá CVS o aktuální verzi projektu. V aktuálním adresáři se mu poté vytvoří adresářová struktura projektu (pokud je projekt organizován do samostatných celků, zvaných moduly, může si vyádat i jeden konkrétní modul). Poté, co dokončil práci na jednom (či několika) soborech, provede příkaz commit, čímž se jeho změny zanesou do hlavního stromu. Pak lze pracovní kopii smazat pomocí release, přičemž se ještě provede kontrola změn.
Pokud dojde ke konfliktu verzí, commit selže s hlášením Up-to-date check failed. V takovém případě si je třeba pomocí příkazu update obstarat aktuální verzi: CVS se pokusí oba soubory sloučit (podobným způsobem, jakým se o to pokouší program patch). V případě, že se v některém místě nedá o sloučení verzí rozhodnout, zanesou se do zdrojového textu korekturní značky <<<<<<, ======= a >>>>>>, přičemž nebude monžé provést commit tohoto souboru, dokud nebudou odstraněny.

Příkazy CVS - příklady

Předpokládejme, že se kořen vývojového stromu CVS pro projekt plpoint nachází na počítači atrey.karlin.mff.cuni.cz, v adresáři /hdd/home/lisak/PROJEKT/cvsroot uživatele lisak, vývojář se jmenuje imtheboss a pracuje na počítači olymp.mff.cuni.cz:

Další možnosti

Přidání souboru k projektu
cvs add soubor
(pouze přidá soubor, neprovede jeho checkout. Takto lze přidat i více souborů najednou. Pro přidání komplexní adresářové struktury je třeba použít příkaz import). Pozor na přidávání binárních (netextových) souborů k projektu: Aby nedošlo k jejich poškození, je třeba použít při jejich přidávání přepínač -kb.
Odstranění souboru z projektu
  1. Smažte soubor z pracovního adresáře
  2. cvs remove soubor
  3. cvs commit soubor
Odstranění adresáře
Odstraňte z něj všechny soubory a proveďte příkaz
cvs update -P
(nebo checkout, nebo export) - tím dojde k odstranění všech prázdných adresářů z repozitáře.
Přesun/přejmenování souboru v repozitáři
Nejjednodušším a nejbezpečnějším (přestože ne nejrychlejším) způsobem jak to provést je odstranit soubor z původní lokace a přidat ho jako nový soubor z nového místa (nevýhoda: vynuluje se revize, pokud na tom záleží, je třeba si ji předem poznamenat a později ručně změnit pomocí commit -r):
  1. mv OLD NEW
  2. cvs remove OLD
  3. cvs add NEW
  4. cvs commit OLD NEW
Zjitění rozdílů
cvs diff soubor
Toto má smysl pro editovaný, avak jetě necommitnutý soubor. Vypíí se rozdíly od poslední revize tohoto souboru ve formátu výstupu příkazu diff.
Zvyování čísel verzí
cvs commit -r verze
Zvýí číslo releasu souboru (v tomto případě všech souborů v akt. adresáři včetně rekurze). Číslo verze musí být vyšší nebo rovno nejvyššímu číslu releasu.
Přiřazení symbolického jména revizi souboru/ů
Nejčastěji se používá pro všechny soubory celého projektu, kdy se každému souboru dané revize přiřadí symbolické jméno, které později umožňuje snadný návrat k této verzi celého projektu (např. stabilní verzi označíme v některém okamiku jako stable a pokračujeme ve vývoji. Kdykoliv budeme potřebovat stabilní verzi např. pro předběžné předvedení, použijeme starší stabilní verzi stable namísto neotestované novější)
cvs tag označení jméno_souboru/adresáře
Pokud není uvedeno jméno, použije se aktuální adresář (rekurzívně)
Přístup k takto označené verzi je možný pomocí příkazu
cvs checkout -r označení jméno_modulu
Jste-li na pochybách, příkaz cvs povel -H vypíše nápovědu o přepínačích, které je možné s tímto povelem použít a co dělají.

Prostředky pro práci v týmu

CVS podporuje dva způsoby kontroly konfliktů: Rezervované a nerezervované checkouty.
Rezervované checkouty
Zamkne/odemkne aktuální release souboru/ů. Zabrání komukoliv pokračovat v jejich vývoji a přidávat nové releasy (užitečné pro soubory, ve kterých nelze provádět update pomocí diffu - např. binárky):
cvs admin -l soubor/adresář zamkne
cvs admin -u soubor/adresář odemkne
Nerezervované checkouty
Princip: Pokud chce někdo zajistit, aby nedocházelo k neuvědomělým konfliktům u některého souboru, nastaví si na něj watch. Kdokoliv bude chtít tento soubor editovat, bude upozorněn, že tento soubor je sledován. Musí podniknout zvláštní krok, kterým oznamuje, že jej i přesto hodlá editovat (tento krok může zahrnovat, například, rozeslání mailu všem vývojářům, kteří o to projeví zájem).
Postup:
  1. Uživatel nastaví "ohlašovací povinnost" na soubor, který chce sledovat
    cvs watch on soubor
  2. Zadá, jakou akci má zájem sledovat
    cvs watch add -aakce soubor
    akce můe nabývat různých hodnot (viz info soubory), nejobvyklejší je však edit (informovat při editování jiným uživatelem) a all (všechny události, to je také default, pokud není -a specifikováno)
Postup při editaci:
  1. Jiný vývojář si checkoutne novou verzi a zjistí, že soubor, který se pokouší editovat, je read-only. Z toho usoudí, že o tento soubor má někdo zájem
  2. cvs watchers soubor
    (Zjistí, kdo soubor sleduje a případně se s ním dohodne o dalším postupu.)
  3. Po dohodě může začít s prací:
    cvs edit soubor
    (tím vyvolá událost edit pro daný soubor. Nyní, pokud někdo zadá cvs editors soubor, objeví se tento uživatel va výpisu editorů)

Informace o souborech

K získání informací o souborech a výpisu popisků k jednotlivým verzím slouží příkazy annotate, log a history. Všechny dělají v podstatě to samé a mají spoustu přepínačů, kterými je přinutíte vypsat to, co asi tak chcete vědět. Doporučuji použít nápovědný přepínač -H, domnívám se, že je to záležitost poměrně intuitivní.
 

Něco málo o větvích

CVS umožňuje, krom lineárního vývoje, také dělení vývoje do větví a jejich další slučování. Jedná se ovšem o značně pokročilý aspekt CVS, ideální k zanesení příšerných zmatků. Doporučuji používat s mírou
 
Tvorba větve
cvs tag -b jmeno_vetve
Vytvoří větev z aktuální pracovní kopie a přiřadí jí symbolický název jmeno_vetve. Pozor, nenastaví pracovní kopii do této větve! (Předpokládám že se nacházíte v kořeni adresáře aktuální pracovní kopie)
cvs rtag -b -r jmeno_release jmeno_nove_vetve jmeno_modulu
Vytvoří novou větev z nějaké starší větve.
Přístup k větvím
cvs checkout -r jmeno_vetve jmeno_modulu
Vytáhne z modulu větev jmeno_vetve
cvs update -r jmeno_vetve
Přepne aktuální pracovní kopii do nové větve (Předpokládám že se nacházíte v kořeni adresáře aktuální pracovní kopie, jinak možno přidat též jméno modulu)
Spojování větví (ke hlavnímu kmeni)
  1. cvs checkout modul
    (vezmu aktuální release daného modulu)
  2. cvs update -j jmeno_vetve jmeno_souboru/ů
    (slije soubor/y s danou větví)
  3. cvs commit...