Etusivu > ATK > GNU/Linux > RCS

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

Expexperimentalkoeluontoinen
Stabstablevakaa
Relreleasedjulkaistu

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:ää.

komentonäppäilyselitys
vc-registerC-x v irekisteröi tiedoston RCS:ään
vc-toggle-read-onlyC-x C-qkirjaa tiedoston sisään (kysyy lokiviestiä) tai ulos
vc-finish-logentryC-c C-csulkee loki-ikkunan ja kirjaa tiedoston sisään
vc-diffC-x v =näyttää eron työtiedoston ja viimeisimmän version välillä
vc-print-logC-x v lnäyttää tiedoston versiolokin

Harjoitustehtäviä

Tässä on muutamia harjoitustehtäviä RCS:n käytöstä. Harjoitustehtävien mallisuoritus on kohdassa mallisuoritus.

  1. Luo hakemisto RCS ja tiedosto foo, joka sisältää sanan fooo.
  2. Lisää tiedosto RCS:ään siten, ettei työtiedostoa poisteta. Anna tiedoston kuvaukseksi "this is a test file".
  3. Ha eja lukitse tiedosto RCS:stä ja lisää sen perään sana bar.
  4. Tee muutetust tiedostosta uusi versio RCS:ään siten, ettei työtiedostoa poisteta. Laita muutoksen kommentiksi "added bar".
  5. Hae ja lukitse tiedoston alkuperäinen versio RCS:stä. Lisää sen perään sana baz.
  6. Vie muutettu tiedosto RCS:ään siten, että versiohistoria haarautuu. Anna kommentiksi "added baz".
  7. Hae ja lukitse tiedoston versio 1.2 RCS:stä.
  8. Korvaa tiedoston sisältö sanalla baz ja vie uusi versio RCS:ään siten, ettei työtiedostoa poisteta. Laita muutoksen kommentiksi "replaced by baz".
  9. Listaa tiedoston lokiviestit.
  10. 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
=============================================================================
$ 

[Versiohistoria.png]

Lähteet

Sivun viimeisin muutos: "2005-05-30 09:43:06 mtreinik"