RCS
RCS on yksinkertainen tiedostojen versionhallintajärjestelmä. Ohjelmien lähdekoodiin ja elektronisiin dokumentteihin on usein tarpeen tehdä muutoksia. Versionhallintajärjestelmien avulla muutosten hallintaa voidaan helpottaa ja automatisoida. Tällä sivulla esitellään yleinen versionhallintajärjestelmä RCS ja annetaan esimerkkejä sen käytöstä. Lopussa on muutamia harjoitustehtäviä.
Johdanto
Tausta
Ohjelmien lähdekoodiin ja elektronisiin dokumentteihin on usein tarpeen tehdä muutoksia. Ohjelmia kehitetään ja korjataan, ja dokumentit elävät. Yleensä ei riitä, että tärkeistä tiedostoista on saatavilla vain uusimmat versiot. Lisäksi samoja tiedostoja saattaa muokata moni henkilö, mahdollisesti sekoittaen toistensa tekemisiä. Eri versioissa tehtyjen muutosten yhdistäminen yhteen tiedostoon on vaivalloista tehdä käsin.
Versionhallintajärjestelmien avulla samasta tiedostosta voidaan ylläpitää useita erilaisia versioita. Versionhallinnan avulla voidaan tietää, mitä muutoksia tiedostoon on missäkin vaiheessa tehty.
Versionhallintajärjestelmillä voidaan myös hallita sitä, etteivät eri käyttäjät sotke toistensa töitä. Niillä voi yleensä myös yhdistää automaattisesti tiedoston eri versioita yhdeksi uudeksi tiedostoversioksi.
Lähteistä
Tämä ohjeen lähteinä ovat RCSINTRO(1)-manuaalisivu, The RCS MINI-HOWTO ja CVS-RCS-HOW-TO.
Yleistä RCS:stä
RCS (Revision Control System) on eräs yleinen helppokäyttöinen ja helposti asennettava versionhallintajärjestelmä. Se on tarkoitettu tekstitiedostojen, kuten lähdekoodin versionhallintaan.
RCS-tiedostot
RCS tallettaa tiedoston kaikki versiot tiedostoon, jota kutsutaan RCS-tiedostoksi. Käyttäjän ei tarvitse editoida RCS-tiedostoa. Käyttäjän editoitavaa tiedostoa kutsutaan työtiedostoksi.
Versiot talletetaan RCS-tiedostoon tilaa säästävällä tavalla: uusin versio talletetaan sellaisenaan, muista versioista talletetaan vain erot uudempaan versioon nähden. RCS tunnistaa muutokset automaattisesti.
Tiedostoversion tunnistetiedot
Jokaisesta versiosta talletetaan versionumero, muutoksen tekijä ja tekohetki sekä muutokseen mahdollisesti liitetty lokiviesti. Lokiviestien avulla on helppo seurata, mitä muutoksia minkäkin versioiden välillä on tehty. Tiedostoversioita voi hakea paitsi versionumeron, myös tekijän tai tekohetken perusteella.
Versioille voi antaa myös tilatietoja (luonnos, valmis, hyväksytty, ...), joiden perusteella on mahdollista muodostaa konfiguraatioita (Konfiguraatio on tiedostokokoelma, johon kuuluu yksi versio kustakin tiedostosta). Tiedostoversioiden tunnistetietoja (versionumero, tekijä, ...) voi automaattisesti sisällyttää tiedostojen sisälle (ks. kohta Automaattiset tunnistetiedot). Esimerkiksi ohjelmakoodin kommenttiin voi sisällyttää tiedoston versionumeron, joka päivittyy automaattisesti, kun tiedostosta luodaan uusia versioita.
Konfliktien hallinta ja versiohistoria
RCS ehkäisee rinnakkaisesta editoinnista johtuvat konfliktit estämällä lukituksilla saman tiedoston yhtäaikaisen editoinnin. RCS varoittaa käyttäjää, jos tämä yrittää muokata tiedostoa, joka on jo toisen käyttäjän muokattavana.
Monen käyttäjän järjestelmäksi rinnakkaisen editoinnin mahdottomuus on RCS:n pahin puute. Projekteihin, joissa useamman henkilön tulee päästä muokkaamaan samoja tiedostoja yhtä aikaa, kannattaa käyttää monipuolisempia versionhallintajärjestelmiä, kuten CVS:ää.
Tiedostoversiot voivat muodostaa puun, jossa on haaroja. Samasta tiedostosta voi siis johtaa useita rinnakkaisia versioita, jotka elävät omaa elämäänsä. Eri käyttäjät voivat siis editoita yhtäaikaisesti saman tiedoston eri versioita.
Versiohaaroja on mahdollista yhdistää puoliautomaattisesti. Jos versioita ei voi yhdistää ilman ristiriitoja, RCS varoittaa käyttäjää versioiden päällekkäisyyksistä.
RCS:n käyttö
RCS-ohjelmisto koostuu muutamista ohjelmista, joista
tarpeellisimmat ovat ci
ja co
.
ci
(check-in) luo tiedostosta uuden version ja kirjaa sen
järjestelmään. co
(check-out) kirjaa tiedoston ulos
järjestelmästä, jolloin sitä voi editoida.
Uloskirjattuun tiedostoon tehdyt muutokset saa selville komennolla
rcsdiff
. Komennolla rcs
voi muokata
RCS-tiedoston asetuksia, esimerkiksi tiedostojen lukituksia. Komento
rcsclean
poistaa tarpeettomat työtiedostot. Komento
rcsmerge
yhdistää kaksi versiopuun haaraa yhdeksi
työtiedostoksi. Komento rlog
tulostaa
lokiviestejä. Komento ident
etsii tiedostosta
automaattisesti päivitettäviä tunnistetietoja.
Seuraavassa on esimerkkejä RCS:n käytöstä.
RCS-hakemiston luominen
mkdir RCS
Luo alihakemiston RCS
, jonne RCS-tiedostot
kirjoitetaan. Jos alihakemistoa ei ole, RCS-tiedostot kirjoitetaan
samaan hakemistoon työtiedostojen kanssa.
Tiedoston kirjaaminen RCS:ään
ci -u tiedosto.c
Luo tiedostosta tiedosto.c
uuden version ja kirjaa sen
RCS-tiedostoon. Jos -u
jätetään pois, RCS poistaa
työtiedoston.
Tiedoston uloskirjaaminen RCS:stä editoitavaksi
co -l tiedosto.c
Lukitsee tiedoston tiedosto.c
, jolloin käyttäjä itse voi
muokata tiedostoa, mutta muut eivät.
Tiedostoon tehtyjen muutosten tulostaminen
rcsdiff tiedosto.c
Tulostaa erot työtiedoston ja viimeisimmän järjestelmään kirjatun version välillä.
Tiedoston versiohistorian tulostaminen
rlog tiedosto.c
Tulostaa tiedoston tämänhetkisen tilan ja versiohistorian lokiviesteineen.
Uuden versiohaaran aloittaminen
ci -u -r1.3.1 tiedosto.c
Aloittaa tiedoston tiedosto.c
versiosta 1.3 uuden
versiohaaran ja kirjaa tiedoston versionumerolla 1.3.1.1.
Tietyn version hakeminen
co -l -r1.3 tiedosto.c
Hakee tiedostosta tiedosto.c
version 1.3 muokattavaksi. Jos
tiedostoa muokataan, ja se kirjataan takaisin järjestelmään,
versiohistoria haarautuu versiosta 1.3.
Version tilan asettaminen
rcs -sStab:1.3 tiedosto.c
Asettaa tiedoston tiedosto.c
version 1.3 tilaksi Stab. Tila
voi olla mikä tahansa merkkijono, mutta yleisesti käytettyjä ovat
Exp | experimental | koeluontoinen |
Stab | stable | vakaa |
Rel | released | julkaistu |
Automaattiset tunnistetiedot
Työtiedosto voi sisältää tunnistetietoja, jotka RCS osaa laventaa
automaattisesti. Esimerkiksi työtiedostoon kirjoitettu koodi
$Id$
laventuu co
-komennon yhteydessä muotoon
$Id: index.html.ht,v 1.12 2005/05/30 06:43:07 mtreinik Exp $
Muut mahdolliset tunnistetiedot ovat
$Author$ | tiedoston tekijä, eli se käyttäjä, joka kirjasi version sisään |
$Date$ | sisäänkirjauksen päiväys ja aika |
$Header$ | sama kuin $Id: index.html.ht,v 1.12 2005/05/30 06:43:07 mtreinik Exp $ , mutta tiedoston nimi polkuineen |
$Locker$ | tiedoston lukinneen käyttäjän käyttäjätunnus |
$Log$ | sama kuin $Id$ ja sen jälkeen tiedoston lokiviestit |
$Name$ | uloskirjanneen käyttäjän nimi, jos annettu |
$RCSfile$ | RCS-tiedoston nimi ilman polkua |
$Revision$ | versionumero |
$Source$ | RCS-tiedoston nimi polkuineen |
$State$ | version tila |
RCS ja Emacs
RCS integroituu näppärästi Emacsin versionhallintaan, jolloin Emacsia voi käyttää käyttöliittymänä RCS:n komennoille. Seuraavassa on luettelo Emacs-komentoja, joilla voi käyttää RCS:ää.
komento | näppäily | selitys |
---|---|---|
vc-register | C-x v i | rekisteröi tiedoston RCS:ään |
vc-toggle-read-only | C-x C-q | kirjaa tiedoston sisään (kysyy lokiviestiä) tai ulos |
vc-finish-logentry | C-c C-c | sulkee loki-ikkunan ja kirjaa tiedoston sisään |
vc-diff | C-x v = | näyttää eron työtiedoston ja viimeisimmän version välillä |
vc-print-log | C-x v l | näyttää tiedoston versiolokin |
Harjoitustehtäviä
Tässä on muutamia harjoitustehtäviä RCS:n käytöstä. Harjoitustehtävien mallisuoritus on kohdassa mallisuoritus.
- Luo hakemisto
RCS
ja tiedostofoo
, joka sisältää sanan fooo. - Lisää tiedosto RCS:ään siten, ettei työtiedostoa poisteta. Anna tiedoston kuvaukseksi "this is a test file".
- Ha eja lukitse tiedosto RCS:stä ja lisää sen perään sana bar.
- Tee muutetust tiedostosta uusi versio RCS:ään siten, ettei työtiedostoa poisteta. Laita muutoksen kommentiksi "added bar".
- Hae ja lukitse tiedoston alkuperäinen versio RCS:stä. Lisää sen perään sana baz.
- Vie muutettu tiedosto RCS:ään siten, että versiohistoria haarautuu. Anna kommentiksi "added baz".
- Hae ja lukitse tiedoston versio 1.2 RCS:stä.
- Korvaa tiedoston sisältö sanalla baz ja vie uusi versio RCS:ään siten, ettei työtiedostoa poisteta. Laita muutoksen kommentiksi "replaced by baz".
- Listaa tiedoston lokiviestit.
- Piirrä kuva tiedoston versiohistoriasta. (mallivastaus)
Harjoitustehtävien mallisuoritus
$ mkdir RCS $ echo foo >foo $ ci -u foo RCS/foo,v <-- foo enter description, terminated with single '.' or end of file: NOTE: This is NOT the log message! >> this is a test file >> . initial revision: 1.1 done $ co -l foo RCS/foo,v --> foo revision 1.1 (locked) done $ echo bar >>foo $ ci -u foo RCS/foo,v <-- foo new revision: 1.2; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> added bar >> . done $ co -l -r1.1 foo RCS/foo,v --> foo revision 1.1 (locked) done $ echo baz >>foo $ ci -u foo RCS/foo,v <-- foo new revision: 1.1.1.1; previous revision: 1.1 enter log message, terminated with single '.' or end of file: >> added baz >> . done $ co -l foo RCS/foo,v --> foo revision 1.2 (locked) done $ echo baz >foo $ ci -u foo RCS/foo,v <-- foo new revision: 1.3; previous revision: 1.2 enter log message, terminated with single '.' or end of file: >> replaced by baz >> . done $ rlog foo RCS file: RCS/foo,v Working file: foo head: 1.3 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 4; selected revisions: 4 description: this is a test file ---------------------------- revision 1.3 date: 2001/04/20 12:17:10; author: mtreinik; state: Exp; lines: +1 -2 replaced by baz ---------------------------- revision 1.2 date: 2001/04/20 12:15:26; author: mtreinik; state: Exp; lines: +1 -0 added bar ---------------------------- revision 1.1 date: 2001/04/20 12:14:58; author: mtreinik; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2001/04/20 12:16:03; author: mtreinik; state: Exp; lines: +1 -0 added baz ============================================================================= $
Lähteet
- Walter F. Tichy, Paul Eggert, RCSINTRO(1) manual page, revision 5.3, 1993-11-03.
- Robert Kiesling, The RCS MINI-HOWTO, v1.4, 1997-08-14.
- Al Dev (Alavoor Vasudevan), CVS-RCS- HOW-TO document for Linux (source Code Control System), v19.0, 2001-01-24.