Příkaz slouží k aktualizaci stažených pracovních adresářů nebo souborů. Pokud nemá žádné vstupní argumenty, zaktualizuje aktuální adresář. Příkaz nepotřebuje informaci o repozitáři, získá ji ze souborů ve speciálním adresáři CVS.
Užitečné volby:
-A, -P, -r, -D: Mají stejný význam jako u checkout. Pokud nezadáme -A, -r ani -D, příkaz bude aktualizovat podle naposled zadané větve či značky.
-d: Vytváření adresářů. Pokud v repozitáři vznikne nový adresář, vytvoří se nám též v pracovním adresáři.
Jak tedy provést aktualizaci?
Postavíme se do adresáře glib a zadáme:
cvs update -Pd
Pokud jste ještě nesmazali testovací data z minulého týdne, můžete na nich příkaz otestovat – cvs si zkontroluje změny, ke kterým za poslední týden došlo v příslušné větvi repozitáře, a přenese je do našeho pracovního adresáře.
Pokud chceme stát o adresář výš, napíšeme:
cvs update -Pd glib
Opět můžeme zaktualizovat pouze jeden soubor (stojíme-li v pracovním adresáři):
cvs update -Pd -r glib-1-2 ChangeLog
Pokud bychom chtěli získat snímek pracovního adresáře např. k poledni 1. února, zadáme (což ovšem můžeme udělat také s příkazem checkout):
cvs update -Pd -D "2002-02-01 12:00:00"
Pomocí příkazu update lze také přecházet mezi jednotlivými větvemi. Následující příklad nám převede libovolnou větev na větev Glib1:
cvs update -APd -r glib-1-2
Použití samotné volby -A bez zadání větve provede přechod k hlavní větvi (HEAD).
Důležité rozdíly update a checkout
Je třeba pamatovat na to, že příkaz checkout pracuje se zadanými jmény modulů a repozitáře, zatímco update získává informaci ze speciálních adresářů (nepotřebuje tedy informaci o adrese repozitáře). Pokud dojde v repozitáři ke změně v modulech, ze kterých se projekt skládá, update to nezaregistruje. V takové situaci musíme provést checkout.
Příkaz checkout může mít za stejné situace problémy, pokud jej provádíme do již existujícího adresáře a ve staré verzi je určitý adresář součástí datového bloku, zatímco v další verzi je použit jako modul.
V praxi používám k aktualizaci většinou příkaz update. Pokud si však kompilátor stěžuje na chybějící soubory, zkusím checkout a soubory se většinou připojí.
Informační příkaz status
Zjišťovat jména větví nebo značek někde v dokumentaci je často nepraktické. Tuto informaci naštěstí můžeme získat i pomocí příkazu status.
Užitečná volba:
-v: Vypíše informace o značkách a větvích.
Vybereme si ve staženém pracovním adresáři Glib1 libovolný soubor a zadáme např.:
cvs status -v ChangeLog
=================================================================== File: ChangeLog Status: Needs Patch Working revision: 1.257.2.98 Repository revision: 1.257.2.105 /cvs/gnome/glib/ChangeLog,v Sticky Tag: glib-1-2 (branch: 1.257.2) Sticky Date: (none) Sticky Options: (none) Existing Tags: glib-2-0 (branch: 1.1085.2) glib-2-0-branchpoint (revision: 1.1085) GLIB_2_0_1 (revision: 1.1079) GLIB_2_0_0 (revision: 1.1060) GLIB_2_0_0_RC1 (revision: 1.1055)
A kdesi dole najdeme:
GLIB_1_2_1 (revision: 1.257.2.13) glib-1-2 (branch: 1.257.2) GLIB_1_2_0 (revision: 1.257)
Z vypsaných větví snadno odhadneme, která je ta správná.
Informační příkaz log
Dalším typem poskytovaných informací je seznam změn, provedených u daného souboru. Bývá detailnější než ChangeLog, neboť komentář je v podstatě povinný.
Zadáme:
cvs log configure.in
A dostaneme:
RCS file: /cvs/gnome/glib/configure.in,v Working file: configure.in head: 1.280 branch: locks: strict access list: symbolic names: glib-2-0: 1.279.0.2 glib-2-0-branchpoint: 1.279
Atd. Následuje výpis změn:
keyword substitution: kv total revisions: 320; selected revisions: 320 description: ---------------------------- revision 1.280 date: 2002/04/29 08:05:42; author: pablo; state: Exp; lines: +1 -1 Added Vietnamese file ---------------------------- revision 1.279 date: 2002/04/07 23:09:08; author: utx; state: Exp; lines: +1 -1 2002-04-08 Stanislav Brabec <utx@penguin.cz> * cs.po: Added Czech (cs) to ALL_LINGUAS. ----------------------------
Atd. Jedná se o popis změn, provedených v kódu. Pokud by vám takový popis nestačil, můžete použít ještě detailnější rozpis pomocí příkazu annotate.
Informační příkaz checkout -c
Zmínili jsme se o tom, že existují moduly. Tento příkaz (nebo vlasně jen speciální volba) nám vypíše všechny moduly existující v repozitáři (pozor, nejde o výpis všech projektů, ale jen o moduly).
Zadáme příkaz (předpokládejme nastavenou proměnnou CVSROOT):
cvs checkout -c >gnome-modules.txt
Dostaneme dlouhý seznam a v něm i řádku:
glib glib &build
Nyní již víme, že i Glib se při stahování z CVS sestavuje ze dvou modulů.
CVS a editované soubory
Tato funkce, díky které se může na práci podílet více lidí v jednom okamžiku, patří mezi nejdůležitější vlastnosti CVS.
Při aktualizaci textového souboru v pracovním adresáři se soubor nepřepíše, ale pomocí techniky, jakou používá příkaz diff, se provede pokus spojit data z repozitáře s naší úpravou. Někdy se to nepovede a pak je na nás, abychom vzniklé odmítnuté části záplaty (vyznačené řadou většítek a menšítek) zakomponovali do textu ručně, ale většinou dojde ke spojení změn bez problémů.
Pokud si soubor v pracovním adresáři pokazíme nevhodnou editací, můžeme jej jednodušše smazat a příkaz update nebo checkout jej obnoví v jeho nemodifikované podobě.
Zápisový příkaz commit
Tento příkaz slouží k odeslání změn z pracovního adresáře do repozitáře. K jeho spuštění samozřejmě potřebujeme právo zápisu do repozitáře.
Užitečná volba:
-m: Zpráva do protokolu, pokud ji nechceme zadávat v editoru (vhodné ve skriptech).
Zkratka: ci
Jak tedy pošleme změnu do repozitáře? Ukážeme si to názorně na jedné z posledních změn, kterou jsem provedl v repozitáři Glib2 – přidání českého překladu. Prosím, abyste tento příklad nezkoušeli v praxi! Jako anonymnímu uživateli vám nebude fungovat a se zápisovým právem byste mohli testovacími daty poškodit projekt.
Uložení českého překladu vyžaduje dvě změny v repozitáři – přidat nový soubor po/cs.po a do řádku ALL_LINGUAS v souboru configure.in přidat cs (zápis do ChangeLog považuji za samozřejmý).
Nejdříve si připravím aktuální pracovní adresář a provedu potřebné změny.
Pro další ukázky předpokládejme, že stojíme v hlavním adresáři projektu Glib2.
Nejdříve je třeba sdělit, že v repozitáři přibude nový soubor (k tomu slouží příkaz add):
cvs add po/cs.po
Nyní už zbývá změny poslat:
cvs commit
Naběhne editor a budeme vyzváni, abychom zapsali komentář ke změně. Zběžně přečteme řádky s komentářem, abychom si ověřili, že skutečně posíláme jen to, co chceme.
Opustíme editor a vyčkáme na výsledek – zprávu o číslech verzí, pod kterými byly naše úpravy zapsány.
Mohli jsme být i konkrétnější a napsat:
cvs commit po/cs.po configure.in ChangeLog
Ne vždy vše proběhne hladce. U často modifikovaných projektů může dojít k situaci, že zatímco jsme v pracovním adresáři prováděli změny, někdo jiný své změny uložil do repozitáře. V takovém případě server naše změny (ve všech souborech) odmítne s hláškou:
cvs commit: Up-to-date check failed for `ChangeLog' cvs [commit aborted]: correct above errors first!
Znamená to, že musíme zaktualizovat soubor vůči nejnovějšímu stavu repozitáře. V (lepší) většině případů je řešení prosté:
cvs update
Opět můžeme adresně zaktualizovat jen vybrané soubory. Program nám oznámí výsledek spojení záplat – buď vše proběhlo v pořádku a my můžeme změny odeslat, nebo došlo k odmítnutí záplaty. Pak musíme provést opravu ručně, popřípadě soubor smazat, zopakovat update a změnu znovu provést do aktuální verze (záleží na tom, co je jednodušší). Poté můžeme přistoupit k dalšímu pokusu o odeslání změn.
Pokud jsme přehlédli odmítnutou záplatu, server změny samozřejmě nepřijme a vyzve nás, abychom svou chybu napravili:
cvs commit: file `ChangeLog' had a conflict and has not been modified cvs [commit aborted]: correct above errors first!
Po opravě odmítnuté záplaty můžeme pokračovat.