CVS
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
- rm *soubory
- cvs rm *soubory
- cd ..
- 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
- rm soubor
- 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