CVS

Z GeoWikiCZ

CVS je zkratkou za Concurrent Version System. CVS je systém, který slouží ke správě verzí projektu. Tyto systémy se v angličtině označují zkratkou SCM - Source Code Management nebo také Source Configuration Management.

Systém CVS spravuje jednu nebo několik skupin souborů nazývaných repozitář (anglicky repository). Každý repozitář má vlastní řízení přístupu a je dělen na menší části nazývané moduly, které mohou reprezentovat projekty nebo skupiny projektů ve stromové struktuře. Celý repozitář je uložen ve formě souborů na souborovém systému serveru. Změny jsou sledovány a uchovávány na úrovni verzí (revizí) jednotlivých souborů ve stromové struktuře projektu. Skupinu souborů lze označit jednou nálepkou (anglicky tag) a vytvářet tak různá vydání celého projektu (anglicky release). V kterémkoli okamžiku je možné vytvořit novou vývojovou větev (anglicky branch) a tu potom rozvíjet samostatně nebo ji později opět sloučit. Stejně tak je možné se kdykoli vrátit k libovolné předchozí verzi libovolného souboru.

CVS se typicky používá jako víceuživatelská klient/server aplikace. Umožňuje, aby na stejném projektu pracovalo více lidí současně a zároveň zajišťuje, že změny provedené kterýmkoli vývojářem jsou konzistentní a distribuovány ostatním. Pro větší projekty, nebo projekty na nichž se podílí více lidí (často na geograficky vzdálených místech) je použití systému pro správu verzí prakticky nezbytností.

Samotný program CVS je dodáván v základní verzi pro použití v příkazovém řádku, existují však i nadstavby pro použití v grafickém režimu, jako je třeba WinCVS a další. Také řada vývojových prostředí (například Eclipse nebo NetBeans) přímo podporuje použití CVS. Existují i jiné systémy pro správu verzí, například Subversion, SourceSafe, ClearCase a další.

Předchozí úvodní text byl převzat z Wikipedie.

Založení CVS repository

Pro založení nového repository slouží CVS příkaz init, kterému zadávame cestu, kde se má nové repository založit (jméno je pochopitelně libovolné). Například

cvs -d /home/novak/work/repository init

V podadresáři repository/CVSROOT jsou uloženy všechny administrativní soubory nového repository, např.

~/work$ ls -R repository/
repository/:
CVSROOT

repository/CVSROOT:
checkoutlist    cvswrappers,v  notify       posttag,v    taginfo
checkoutlist,v  Emptydir       notify,v     postwatch    taginfo,v
commitinfo      history        postadmin    postwatch,v  val-tags
commitinfo,v    loginfo        postadmin,v  preproxy     verifymsg
config          loginfo,v      postproxy    preproxy,v   verifymsg,v
config,v        modules        postproxy,v  rcsinfo
cvswrappers     modules,v      posttag      rcsinfo,v

repository/CVSROOT/Emptydir:

Tyto soubory jsou dále spravovány CVS serverem.

Založení nového projektu

Předpokládejme, že máme vytvořené repository a adresář s projektem, který chceme importovat do CVS repozitory. Nechť jsou například soubory projektu, keterý chceme importovat uloženy v adresáři projektA

~/work$ ls -r projektA/
src  README
cepek@geo:~/work$ ls -R projektA/
projektA/:
README  src

projektA/src:
abc.cpp  Makefile

Přejdeme do adresáře projektA a zadáme příkaz import

cvs  -d /home/novak/work/repository import -m "Initial CVS Import" \
  adresář_projektu jméno_projektu vendor_tag start_tag
N ProjectName/README
cvs import: Importing /home/novak/work/repository/ProjectName/src
N ProjectName/src/Makefile
N ProjectName/src/abc.cpp

No conflicts created by this import

Vytvoření pracovní kopie projektu

Přejdeme do adresáře ve kterém chceme vytvořit pracovní kopii projektu a zadáme příkaz

cvs  -d /home/novak/work/repository co ProjectName 
cvs checkout: Updating ProjectName
U ProjectName/README
cvs checkout: Updating ProjectName/src
U ProjectName/src/Makefile
U ProjectName/src/abc.cpp

Repository

V příkazech CVS lze specifikovat repository explicitně, např.

cvs -d /usr/local/cvsroot checkout yoyodine/tc

nebo explicitně nastavením proměnné CVSROOT

export CVSROOT=/usr/local/cvsroot

parametr -d má vyšší prioritu.

Vzdálené repositáře (remote repositories) mají obecně syntax

:method:user@host:/path/to/repository

Přístup do vzdáleného repository lze umožnit přes ssh klíče. Příklad

gin@josef.fsv.cvut.cz:/home2/gin/cvsroot

Po vytvoření pracovní kopie již není nutné repository uvádět, odkaz je uložen v podadresáři CVS (který je vytvořen v každém podadresáři pracovní kopie).

Odstranění adresáře

  1. rm *soubory
  2. cvs rm *soubory
  3. cd ..
  4. cvs rm adresář

Pak lze adresář vymazat

Prázdné adresáře, které explicitně neodstraníme, zůstavají v pracovní kopii reposotory. Pokud chceme prázdné adresáře odstranit, můžeme v příkazech cvs update a cvs checkout použít parametr -P

cvs update -P

Odstranění souboru

  1. rm soubor
  2. cvs rm soubor

nebo v jednom kroku

cvs rm -f soubor

Binární soubory

cvs admin -kb soubor
cvs update -A soubor

nebo lépe přímo při přidání do repository

cvs add -kb soubor

checkout

Získání pracovní kopie (zkráceně co)

cvs checkout tc

Vytvoří nový adresář tc a naplní jej zdrojovými soubory.

commit

Přejdeme do pracovní kopie projektu, provedené editace přeneseme do společného úložište na serveru příkaze commit (zkráceně ci)

cvs -d /home/novak/work/repository ci

cvs update

Usage: cvs update [-APCdflRp] [-k kopt] [-r rev] [-D date] [-j rev]
    [-I ign] [-W spec] [files...]
        -A      Reset any sticky tags/date/kopts.
        -P      Prune empty directories.
        -C      Overwrite locally modified files with clean repository copies.
        -d      Build directories, like checkout does.
        -f      Force a head revision match if tag/date not found.
        -l      Local directory only, no recursion.
        -R      Process directories recursively.
        -p      Send updates to standard output (avoids stickiness).
        -k kopt Use RCS kopt -k option on checkout. (is sticky)
        -r rev  Update using specified revision/tag (is sticky).
        -D date Set date to update from (is sticky).
        -j rev  Merge in changes made between current revision and rev.
        -I ign  More files to ignore (! to reset).
        -W spec Wrappers specification line.

Příklad:

cvs update -dPA

Větvení

Pro vytvoření samostatné vývojové větve slouží příkaz cvs tag s parametrem -b. Například

cvs tag -b rel-1-0-patches

Kopii větve vytvoříme příkazem

cvs -d REPOSITORY checkout -r rel-1-0-patches modul.

Sloučení větve s kmenem

cvs checkout modul
cvs update -j rel-1-0-patches    # -j jako "join"
cvs ci

Větvení, status a update

Pro určení revize souborů v danémpracovním adresáři můžeme použít příkaz status

cvs status

Je nutné pamatovat na to, že pokud v pracovní kopii (např. rel-1-0-patches) zadáme příkaz update bez explicitního určení návěší větve (parametr -r)

cvs update

jsou soubory aktualizovány na hodnotu z hlavního kmene souborové struktury projektu. Obsah pracovní kopie ale lze vždy aktualizovat na požadovaný stav, např.

cvs update -r rel-1-0-patches

cvs a patch

CVS umožňuje pracovat na lokální kopii zdrojových textů, která nemá povolený zápis na CVS server. Pokud chceme uložit provedené změny v lokální kopii, vyrobíme nejprve soubor změn vzhledem k CVS archivu

 cvs diff -u > my.path

Změny můžeme snadno přenést do ostré kopie (s povoleným zápisem) pomocí programu patch

 patch -p0 < my.patch

-pnum

odtraní nejmenší prefix obsahující num lomítek ze jmen souborů uvedených v patch souboru

-p0

ponechá jména souborů v patch souboru beze změn

Související články