CVS - II

4-dílný seriál o SCM systému CVS, který má za cíl popsat základní principy práce s tímto systémem. Checkout, první commit-y, prohlížení logů.

29.11.2010 00:00 | Miloslav Ponkrác | přečteno 6886×

Správa prvního projektu v systému CVS

Máme tedy první projekt uložený v systému CVS. Kdykoli budeme chtít na projektu pracovat, přepneme se do adresáře, ve kterém chceme pracovat. V tomto adresáři spustíme příkaz:

cvs checkout prvniprojekt

Tento příkaz udělal to, že vytvořil v pracovním adresáři poadresář prvniprojekt, a do něj nahrál aktuální verzi všech souborů. Kromě toho si do každého adresáře přidal poadresář CVS se svými údaji. Nyní můžete v souborech měnit, co se vám líbí. Opravovat chyby, dopisovat, zkrátka pracovat na projektu. Po skončení práce je potřeba vaše změny nahrát zpět do systému CVS, a to příkazem:

cvs commit -m "nejaka poznamka"

Příkaz commit zaznamenává změny na projektu zpět do systému CVS. Teď se možná ptáte, co je na tom tak úžasné. Třeba to, že na projektu může pracovat více lidí najednou, a systém CVS si dokáže poradit i v případě, že více lidí změní stejný soubor. A nebo Vám dokáže vytáhnout stav projektu, jaký byl v libovolné chvíli. Chcete získat stav souborů přesně tak, jako byl třeba 2. prosince? Není to problém. A to je jenom velice malá přehlídka jeho možností. Nikdy žádnou změnu neztratí, a přitom zbytečně neplýtvá diskovým prostorem. Ukládá si totiž pouze změny od předchozí verze, takže jeho data o projektu zabírají poměrně málo místa na disku.

Nutno říci, že příkaz commit je daleko flexibilnější, než bylo uvedeno. Můžete například uložit změny pouze jednoho souboru:

cvs commit -m "nejaka poznamka" jmeno_souboru

Při používání příkazu commit zjistíte, že systém CVS kontroluje pouze soubory, které tam už byly při zakládání projektu. V pracovním adresáři si tedy můžete vytvořit spousty souborů, ale systém CVS si všimne jenom těch, které tam byly od počátku. Pokud potřebujete přidat nový soubor do systému CVS, použijte příkaz spuštěný z pracovního adresáře:

cvs add -m "nejaka poznamka" jmeno_souboru

Systém CVS pracuje se skupinou souborů nazývaných projektem, jak už bylo řečeno výše. Každý soubor, který má být součástí projektu je nutné zaregistrovat, aby CVS věděl, že má hlídat změny i tohoto souboru. To se provádí dvěma způsoby. Prvním je příkaz import, který provede vytvoření nového projektu v systému CVS, a zároveň zaregistruje všechny soubory v aktuálním adresáři i jeho podadresářích. Příkaz import je určen ke kompletnímu vytvoření projektu, to znamená, že navíc všechny soubory nahraje do projektu.

Pokud již máme projekt v systému CVS vytvořený, používá se druhý způsob, a to příkaz add. Tento příkaz zařídí, že systém CVS bere na vědomí, že součástí projektu se stal další soubor, a nic víc! To znamená, že aktuální verze nového souboru není nahrána do systému CVS! To se provede až dalším příkazem, který slouží k nahrávání změněných souborů do systému CVS, a tím je commit. Tedy ještě jednou: po použití příkazu add si systém CVS pouze poznamená, že od této chvíle bude součástí projektu i nově zadaný soubor. Tento soubor si ale nenahraje do systému CVS, protože by v tom byl zmatek. Jediný příkaz, který umožňuje nahrávat změny souborů do systému CVS, je příkaz commit. Proto vám příkaz add vypíše (v angličtině) zprávu, že si poznamenal, že soubor patří do projektu, ale počká si na příkaz commit, který tento soubor nahraje do systému. A poté již bude automaticky nahrávat i změny v novém souboru od všech lidí, kteří pracují na projektu.

Teď již tedy víte, že každý nový soubor je potřeba do projektu zaregistrovat. Dát prostě systému na vědomí, aby nový soubor také považoval za součást projektu. Při registrování je potřeba upozornit na dvě důležité skutečnosti. Za prvé, pokud vytvoříte nový podadresář v projektu, je potřeba ho také zaregistrovat pomocí příkazu add. Provádí se to úplně stejně, jako kdyby to byl soubor. A až potom je možné zaregistrovat soubory v tomto podadresáři. Pokud tedy v pracovním adresáři založíme nový podadresář, a v něm nový soubor, je potřeba nejdříve přidat do systému CVS podadresář, a až poté nový soubor. Podadresář se přidává úplně stejně jako soubor, jenom místo jména souboru uvedeme jméno adresáře.

Druhou důležitou skutečností je to, že musíte dát systému CVS na vědomí, co je čistý textový soubor, a co je binární soubor. Binárním souborem se rozumí například obrázky, dokumenty Office, i když je to z Wordu, apod. Pokud se jedná o čistý text, nic zvláštního se neděje, pokud budete pracovat s binárními soubory, je nutné při registraci tohoto souboru dát systému CVS na vědomí, že to není čistý text! V takovém případě je při registrování pomocí příkazu add nutné použít volbu -kb. V textových souborech totiž provádí CVS určité optimalizace. Příkaz na přidání binárních souborů vypadá tedy takto:

cvs add -kb -m "nejaka poznamka" jmeno_souboru

Pokud přidáte binární soubor, například obrázek, aniž byste systému CVS sdělili, že se nejedná o čistý text, systém CVS takový soubor zdeformuje. Je tedy potřeba si na toto dávat pozor. Pokud čistě náhodou na to zapomenete, a přidáte binární soubor bez volby -kb, tak se to dá opravit následujícím způsobem:

1.krok) Zazálohujete si soubor z pracovního adresáře, který chcete označit jako binární. Je to proto, že v průběhu této akce se soubor zdeformuje a bude potřeba ho obnovit. Pokud je i v pracovním adresáři soubor zdeformovaný (to se stane, pokud jste předtím použili příkaz update), potom je potřeba někde mít čistou, nezdeformovanou verzi souboru, kterou použijete v pátém kroku pro obnovení souboru.

2.krok) Provedete příkaz:
cvs admin -kb jmeno_souboru
Tento příkaz říká, že soubor jmeno_souboru bude od této chvíle označen v databázi systému CVS (tzv. repository) jako binární, a CVS s ním takto bude zacházet.

3.krok) Provedete příkaz:
cvs update jmeno_souboru
Příkaz update slouží k tomu, aby si CVS upravil ve vašem pracovním adresáři své vnitřní záznamy o souboru. Ve druhém kroku jste totiž označili soubor jako binární v repository, ale nikoli ve vašem pracovním adresáři. Tento třetí krok proto přenese označení na binární soubor i do vašeho pracovního adresáře. Pokud tento třetí krok neprovedete, tak Vás bude CVS upozorňovat na chybu.

4.krok) Třetí krok jako vedlejší efekt nahrál do pracovního adresáře zdeformovaný soubor. Proto je potřeba jako další krok nahrát ze zálohy dobrou, nezdeformovanou verzi souboru.

5.krok) Jako poslední krok nahrajeme do systému CVS (do jeho databáze, čili repository) správnou verzi z pracovního adresáře. To se provádí již známým příkazem commit:
cvs commit -m "oprava na binární verzi" jmeno_souboru


Někdy se naopak stane, že potřebujeme nějaký soubor vymazat z projektu. Potom se nám hodí příkaz remove:

cvs remove jmeno_souboru

A opět je potřeba zdůraznit, že příkaz remove nedělá nic jiného, než odregistrovává soubor z projektu. Říká tedy, že soubor přestal být součástí projektu, a systém CVS nebude již dále zaznamenávat změny v tomto souboru. Samozřejmě, že pokud budete chtít vytáhnout ze systému CVS verzi z doby, dokud byl tento soubor součástí projektu, tak ho tam systém CVS přidá, ale ve verzích nahraných do CVS po použití příkazu remove ho přestávají zajímat změny na odregistrovaném souboru.

Příkaz remove nikde nic nemaže, a v pracovním adresáři vám vše nechá v původním stavu. Ale pro úspěšný průběh příkaz remove bude potřeba, aby odstraňovaný soubor v pracovním adresáři nebyl. Pokud budete chtít odstranit soubor, který je přítomný v pracovním adresáři, CVS nic neprovede, a pouze vám vypíše hlášení v anglickém jazyce. Proto je klasický postup pro mazání nejdříve smazat soubor z pracovního adresáře, a poté ho odstranit příkazem remove. Aby se nám nezauzlovaly prsty, pokud budeme rušit více souborů, nabízí CVS parametr -f. Ten provede navíc smazání souboru z pracovního adresáře, a udělá tedy oba kroky naráz:

cvs remove -f jmeno_souboru

Toto je v zásadě to nejdůležitější, co potřebujete ke správě projektu pomocí systému CVS, zejména, pokud ho spravujete sami. Další kapitoly se zabývají některými dalšími finesami systému CVS. Toto vám stačí, abyste si řídili svůj projekt sami doma. Další čtení vám umožňuje ze systému CVS získat více, nebo pracovat ve vícečlenném týmu, ale v zásadě pokud jste dočetli sem, jste schopni si řídit svůj vlastní projekt v jednočlenném týmu sami doma.


Výpisy změn v souborech - logy

V této kapitole si něco povíme o zjišťování změn v souborech uložených do systému CVS. Systém CVS nazývá prostor, ve kterém ukládá data jako repository, ve svých manuálech.

Pokud jsme již soubor několikrát změnili, někdy bývá užitečné zjistit, jaké změny jsme provedli. Pokud jste již práci se systémem CVS zkusili, zjistili jste, že vás CVS nutí každou změnu okomentovat. Většina příkazů má možnost zadaní volby -m, za kterou následuje v uvozovkách poznámka. Pokud poznámku nezadáte, CVS spustí editor, aby jste ji dopsali. Mírně ironicky by se dalo napsat, že vás "nevtíravým" způsobem nutí, aby jste ke každé změně dopsali komentář, co jste to vlastně udělali.

Tyto komentáře mají svůj smysl, jsou totiž přístupné všem. Kromě toho CVS při každé změně zaznamenává datum a čas změny, kdo změnu provedl, zvýší automaticky číslo verze, a další údaje. Kromě toho umožňuje tyto údaje doplnit i do textu v souborech, které jsou součástí projektu.

Začneme tedy něčím jednoduchým. Jak zjistit celou historii změn nějakého souboru? Stačí na to následující příkaz:

cvs log jmeno_souboru

Příkaz log vypisuje všechny možné informace o souboru, který si CVS udržuje. Můžete si tam přečíst i zadané komentáře, kdo změny provedl (tedy ne že by tam bylo přímo jméno, ale objeví se tam přihlašovací jméno toho, kdo spustil cvs commit). Samozřejmostí jsou data, čas, apod. Snad jenom poznámku, příkaz log je možné spustit i bez udání jména souboru, potom vypíše informace o všech souborech, což je pěkně rozsáhlé.

Vzhledem k rozsahu logovacího výpisu i pro jeden soubor se většinou výstup ještě nějak upravuje. Buď se za příkaz připojí filtr more, který zajistí, že se text zastaví po každé obrazovce, a neodjede:

cvs log jmeno_souboru | more

Také je možné logovací výpis uložit do souboru:

cvs log jmeno_souboru > jmeno_souboru_pro_logovaci_vypis

Logovací výpisy můžeme řídit různými volbami. Jak si můžeme snadno ověřit, jsou logovací výpisy velmi rozsáhlé. Mnohdy potřebujeme pouze seznam souborů uložených v repository (tedy zaregistrovaných souborů a adresářů). Toho dosáhneme takto:

cvs log -R

Další volbou je zobrazit pouze změny souborů, které provedl určitý člověk. Předem je potřeba říci, že CVS ukládá s každou změnou provedenou pomocí příkazu commit automaticky i informaci, kdo změnu nahrál. Není to zde ale uloženo jako jméno a příjmení, ale CVS si zjistí, kdo je k počítači momentálně přihlášený, a zapíše si toto přihlašovací jméno. Pokud je potřeba zjistit, které všechny změny má na svědomí uživatel s přihlašovacím jménem sandokan, použijte:

cvs log -wsandokan jmeno_souboru

Jak je vidět z příkladu, použijete volbu -w, za kterou bez mezery následuje přímo přihlašovací jméno uživatele. Vynecháte-li jméno souboru, zobrazí se všechny změny v celém projektu.

Pokud Vám vadí, že se vypisují i soubory v podadresářích, pomocí volby -l (malé písmeno L, nikoli číslice 1) zajistíte, že se budou vypisovat pouze soubory v aktuálním adresáři.

Velmi často Vás také zajímají změnu provedené v určitém čase, třeba za minulý měsíc (aby se vědělo, kdo si zaslouží prémie :-)) ), před dvěma týdny apod. K tomu je určena volba -d, která má velice bohaté možnosti. V následujících příkladech jsou některé z nich uvedeny:

cvs log -d "1 week ago"
   - vypíše změny provedené dříve, než minulý týden

cvs log -d "yesterday"
   - vypíše změny provedené dříve, než včera

cvs log -d "last month"
   - vypíše změny provedené dříve, než za poslední měsíc

cvs log -d "2 hours ago"
   - vypíše změny provedené dříve, než před dvěma hodinami

cvs log -d "1999/12/01"
   - vypíše změny provedené do 1.prosince 1999

cvs log -d "1999/12/01 12:43"
   - vypíše změny provedené do 1. prosince 1999 ve 12:43

cvs log -d "> 1 week ago"
   - vypíše změny provedené později, než před týdnem

cvs log -d ">= 2 hours ago"
   - vypíše změny provedené před dvěma hodinami, a nebo později

cvs log -d "1999/11/01 <= 1999/11/30"
   - vypíše změny provedené od 1.listopadu do 30.listopadu 1999

Výše uvedené informace lze kombinovat, takže například, chcete-li vědět, co všechno změnil uživatel s přihlašovacím jménem abcdefgh za poslední týden v současném adresáři, použijete:

cvs log -wabcdefgh -d ">= last week" -l


Automatické přidávání informací o verzi do souboru, nahrazování klíčových slov

Pokud vyvíjíme nějaký projekt, stane se někdy, že se ptáme, a jakou verzi souboru máš? To se dá zjistit pomocí datumu a času, ale není to ono. Jak tedy zajistit, aby v každém souboru byly napsány potřebné informace, třeba zrovna číslo verze? Nebo další údaje?

Systém CVS toto umožňuje pomocí klíčových slov. Pokud kamkoli do nějakého textového souboru, který je součástí projektu napíšete třeba:

$Date$

a nahrajete změny příkazem commit, zjistíte, že systém CVS vám do souboru přidal celé datum a čas poslední změny souboru:

$Date: 2000/01/09 17:58:58 $

Samozřejmě takových údajů je celá řada, a jsou vyjmenovány a popsány v následujícím seznamu:

Asi nejčastěji se používá klíčové slovo $Id$. Rozepíšeme si jeho výstup podrobněji. Pokud do textu souboru dopíšeme toto slovo, učiníme tak do komentářů. Například v HTML souboru bude vypadat asi takto:

<HTML>
<!-- $Id$ -->
a tak dále

Pokud provedeme příkaz commit, objeví se rozvinutý test namístě $Id$:

<HTML>
<!-- $Id: cvs_manual.html,v 2.11 2000/01/09 17:58:58 ponkrac Exp $ -->
a tak dále

Zde vidíte všechny podstatné údaje o souboru přímo v něm. Vidíte, že soubor se jmenuje cvs_manual. V repository si CVS systém za jméno souboru ukládá čárku a písmeno v. Takže v repository je tento soubor uložen jako cvs_manual.html,v. Dále pokračuje číslo verze, v našem případě 1.1. Poté následuje datum a čas na nultém poledníku, přihlašovací jméno toho, kdo jej uložil, a stav verze, kde Exp znamená experimentální verzi, Stab stabilní verzi a Rel verzi určenou k distribuci. Tak jsou všechny informace po ruce přímo v souboru. Podíváte-li se do mnohých kódů například pro Linux, mnohdy tam klíčové slovo $Id$ najdete.

Je jasné, že pokud použijete automatické nahrazování klíčových slov v nějakém souboru, či ve všech, je potřeba klíčová slova dávat do poznámek, aby nenarušily funkci souboru. Například v jazyce C můžete napsat /* $Id$ */, apod. Dále je potřeba dávat pozor, aby se v souboru náhodou nevyskytly řetězce, které CVS pozná jako klíčové slovo (pokud to není váš záměr). Například já v tomto manuálu nemůžu rovnou napsat $Id$, protože by po tomto řetězci CVS okmžitě "skočil", a nahradil jej. Musím využít toho, že znak $ se může v HTML zapsat jako &#36;, což už CVS nechá na pokoji. Pokud bych chtěl to samé zapsat v jazyce C, aniž by mi to CVS nahradil, musel bych psát třeba char mytxt[] = "\x24Id\x24";, aby mi ho CVS nechal na pokoji. Dlužno ovšem napsat, že takové situace se v praxi vyskytují velice, velice zřídka, takže problémy vám to nejspíše dělat nebude. V krajním případě, pokud nelze jinak, je možné nahrazování klíčových slov zakázat. Jak to lze provést, se dozvíte ještě v této kapitole.

Občas se vám nehodí, aby systém CVS automaticky nahrazoval klíčová slova, a tak máte možnost tento proces řídit. Standardně CVS nahrazuje klíčová slova ve všech souborech v projektu. CVS umožňuje ke každému souboru sdělit, jaký režim nahrazování klíčových slov použijete. Tento režim je možné určit pomocí příkazů add při registraci souboru, a nebo pomocí příkazu admin ho kdykoli později změnit:

cvs add -krežim jmeno_souboru
   nastaví režim nahrazování klíčových slov při registraci souboru

cvs admin -krežim jmeno_souboru
   nastaví režim nahrazování klíčových slov kdykoli později

U volby -krežim se mohou použít tyto možnosti:

Licence: Tento dokument lze volně šířit pro nekomerční účely, bude-li zachováno jméno autora a copyright. Pro komerční účely pouze s písemným svolením autora.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1738