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.