Einführung in CVS - Uni...

25
Einführung in CVS Udo Kelter 09.03.2003 Zusammenfassung dieses Lehrmoduls Das Concurrent Versions System (CVS) ist eines der bekanntesten und am meisten verbreiteten Konfigurationsmanagementsysteme. Die- ses Lehrmodul beschreibt zunächst die Architektur des Systems und grundlegende Funktionsmerkmale, u.a. den konzeptuellen Aufbau ei- nes CVS-Repositories. Anhand eines Beispiels wird die Benutzung der wichtigsten CVS-Operationen einführend dargestellt. Abschließend werden einige Richtlinien angegeben, wie CVS benutzt werden sollte. Vorausgesetzte Lehrmodule: obligatorisch: - Einführung in das Konfigurationsmanagement Stoffumfang in Vorlesungsdoppelstunden: 1.0 1

Transcript of Einführung in CVS - Uni...

Einführung in CVS

Udo Kelter

09.03.2003

Zusammenfassung dieses Lehrmoduls

Das Concurrent Versions System (CVS) ist eines der bekanntestenund am meisten verbreiteten Konfigurationsmanagementsysteme. Die-ses Lehrmodul beschreibt zunächst die Architektur des Systems undgrundlegende Funktionsmerkmale, u.a. den konzeptuellen Aufbau ei-nes CVS-Repositories. Anhand eines Beispiels wird die Benutzungder wichtigsten CVS-Operationen einführend dargestellt. Abschließendwerden einige Richtlinien angegeben, wie CVS benutzt werden sollte.

Vorausgesetzte Lehrmodule:obligatorisch: - Einführung in das Konfigurationsmanagement

Stoffumfang in Vorlesungsdoppelstunden: 1.0

1

Einführung in CVS 2

Inhaltsverzeichnis1 Einleitung 3

2 Grobarchitektur 42.1 Verteilungsarchitektur . . . . . . . . . . . . . . . . . . . . . . 42.2 Programm- und Bedienschnittstellen . . . . . . . . . . . . . . 52.3 Das Kommando cvs . . . . . . . . . . . . . . . . . . . . . . . 6

3 Das Repository 73.1 Konzeptioneller Inhalt eines Repositorys . . . . . . . . . . . . 73.2 Realisierung eines Repositorys . . . . . . . . . . . . . . . . . . 93.3 Bezeichnung eines Repositorys . . . . . . . . . . . . . . . . . 93.4 Übergabe der Repositorybezeichnung an cvs . . . . . . . . . 103.5 cvs login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4 Anlegen eines Repositorys 11

5 Anlegen von Arbeitsbereichen 13

6 Anlegen von Verzeichnissen und Dateien im Repository 14

7 Anlegen und Ändern von Dateien in einem Arbeitsbereich 167.1 checkout und commit . . . . . . . . . . . . . . . . . . . . . . 167.2 update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177.3 Statusabfragen . . . . . . . . . . . . . . . . . . . . . . . . . . 207.4 remove . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

8 Überwachung paralleler Änderungen 20

9 Benutzungsregeln 22

Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Glossar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

c©2003 Udo Kelter Stand: 09.03.2003Dieser Text darf für nichtkommerzielle Nutzungen als Ganzes und unverändert in elektronischer odergedruckter Form beliebig weitergegeben werden und in WWW-Seiten, CDs und Datenbanken aufgenom-men werden. Jede andere Nutzung, insb. die Veränderung und Überführung in andere Formate, bedarfder expliziten Genehmigung. Die jeweils aktuellste Version ist über http://kltr.de erreichbar.

Einführung in CVS 3

1 Einleitung

Das Concurrent Versions System (CVS) ist eines der bekannte-sten und verbreitetsten Konfigurationsmanagementsysteme (KMS).Seinen Erfolg verdankt es mehreren Vorteilen gegenüber anderen KMS:

- Es ist als public-domain-Software frei verfügbar.

- Es ist für alle gängigen Plattformen erhältlich. Für die Bedien-schnittstellen sind plattformspezifische Varianten verfügbar, die andas jeweilige look and feel der Plattform angepaßt sind.

- CVS unterstützt den lokalen und entfernten Zugriff auf ein Archiv.Beim entfernten Zugriff werden diverse Protokolle und Verfahrenzum Einloggen auf den Server und Transfer der Daten unterstützt.

- CVS wurde und wird in sehr vielen Projekten eingesetzt und hatsich in der Praxis in doppelter Hinsicht bewährt: Es läuft äußerststabil, und sein Funktionsumfang und die Auslegung der Basisfunk-tionalitäten sind alltagstauglich.

Der Funktionsumfang von CVS deckt natürlich alle Grundfunktio-nalitäten eines KMS ab. Hinzu kommen diverse Administrationsfunk-tionen.

Ein wichtiges Merkmal von CVS besteht darin, daß die Sperrungvon Dokumenten beim Checkout aus einem Archiv nicht direkt unter-stützt wird. In CVS ist die Strategie, ein Dokument beim Checkoutaus einem Archiv nicht zu sperren, eindeutig bevorzugt. Die Vor- undNachteile beider Strategien – zu sperren bzw. Varianten zuzulassen undi.d.R. automatisch zu mischen –, sind in [KM] schon diskutiert wordenund sollen hier nicht wiederholt werden.

Einige graphische Front-ends für CVS bilden Sperren oberhalb derKernfunktionalität nach, wobei nicht immer klar ist, wie sicher solcheImplementierungen sind.

Intern benutzt CVS intensiv RCS (Revision Control System). MitRCS können Versionen einer Datei lokal verwaltet werden. Von RCSstammen manche Meldungen, die bei der Benutzung von CVS ausgege-ben werden.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 4

2 Grobarchitektur

2.1 Verteilungsarchitektur

Bzgl. der Grobarchitektur muß unterschieden werden, ob das Versions-archiv (das Repository in der Begriffswelt von CVS) lokal, also aufdem gleichen Dateisystem, auf dem auch der Entwickler arbeitet, oderentfernt existiert1.

Bei einem lokalen Versionsarchiv können die von einem Entwickleraufgerufenen CVS-Befehle direkt auf dem Archiv arbeiten.

Bei einem entfernten Versionsarchiv muß auf der Seite des Rech-ners, der das Versionsarchiv enthält, ein Serverprozeß laufen, der überNetzwerkverbindungen ansprechbar ist und die ihm übermittelte CVS-Operation ausführt. Auf dem Rechner, an dem der Entwickler arbeitet,muß ein Programm (das “CVS-Front-end”) verfügbar sein, das mitdem Benutzer kommuniziert, die Verbindung zum Serverprozeß her-stellt und die Kommunikation mit dem Serverprozeß abwickelt, s. Bild1.

Bei einem entfernten Zugriff entstehen durch die Rechnerkommu-nikation diverse Probleme bzgl. der Sicherheit und der Auswahl derKommunikationsprotokolle; auf diese Fragen gehen wir hier nicht nä-her ein. Es dürfte nicht überraschen, daß das Einrichten eines entferntzugänglichen CVS-Repositorys kompliziert ist und Grundwissen überRechnernetzwerke erfordert.

Ein besonders positiver Aspekt von CVS ist, daß im normalen Be-trieb, sobald das Repository eingerichtet ist, praktisch kein Unterschiedzwischen einem lokalen und einem entfernten Archiv zu bemerken ist.

1Bei verteilten Dateisystemen wie NFS können Dateisysteme, die in Wirklichkeitauf einem Server gespeichert sind, bei anderen Rechnern – typischerweise Arbeits-platzrechnern – eingespiegelt werden. Auf den Arbeitsplatzrechnern bemerkt manabgesehen von der Performance und einigen speziellen Details keinen Unterschiedzwischen lokal gehaltenen und eingespiegelten Dateisystemen. Ein Versionsarchiv,das in einem eingespiegelten Dateisystem liegt, ist im Sinne von CVS daher ein lokalvorhandenes Archiv, obwohl es nicht wirklich auf einer lokalen Platte gespeichertist.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 5

CVS−

Front−end

Entwickler

CVS−Server−

Prozeß

Reposi−tory

Arbeits−

ServerArbeitsplatzrechner

bereich

Abbildung 1: Front-end und CVS-Server

2.2 Programm- und Bedienschnittstellen

CVS ist ein Datenverwaltungssystem in dem Sinne, daß es einen Da-tenbestand – ein CVS-Repository – einkapselt2 und nach außen hinbestimmte Operationen exportiert, die auf diesem Datenbestand ope-rieren. Diese Operationen sind sowohl von Entwicklungswerkzeugen(insb. Editoren) aus aufrufbar wie auch durch selbständige Programme,die Entwicklern eine Bedienschnittstelle anbieten.

Das originäre CVS-System enthält “nur” eine Kommandozeilen-Schnittstelle. Für Anfänger, deren Erfahrung mit Rechnern durchSpiele oder Büropakete geprägt ist, sind solche Bedienschnittstellenungewohnt. Für professionellere Anwender sind Kommandozeilen-Schnittstellen dagegen wichtiger als graphische Schnittstellen, da sie ofteffizienter bedient werden können und insb. weil man durch sie CVS-Operationen innerhalb von Shell-Skripten aufrufen kann; Shell-Skriptendienen meist zur Automatisierung umfangreicherer Arbeitsvorgänge.

Zusätzlich zur Kommandozeilen-Schnittstelle stehen diverse graphi-sche Bedienschnittstellen für CVS zur Verfügung. Diese basieren teil-weise direkt auf der Kommandozeilen-Schnittstelle, d.h. wenn z.B. überein Menü eine CVS-Operation aufgerufen wird und ggf. über ein For-

2Daß diese Kapselung nicht sicher ist und leicht durchbrochen werden kann, solluns hier nicht stören.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 6

mular Parameter erfaßt werden, dann wird aus diesen Angaben letztlicheine Kommandozeile konstruiert und die Kommandozeilen-Schnittstellewird mit dieser Kommandozeile aufgerufen. Manche graphischen Be-dienschnittstellen zeigen diese Kommandozeile in einem Protokollfeldauch direkt an. Die Historie mehrerer Operationsaufrufe innerhalb ei-ner Sitzung kann so gut überblickt werden, sofern man die Kommandosversteht.

Die eigentlich interessante Leistung graphischer Front-ends bestehteher in graphischen Darstellungen von Versionsabhängigkeiten oderDifferenzen zwischen Dateien und ggf. Editierfunktionen zum Zusam-menmischen von Varianten. Diese Funktionen sind bei den einzelnengraphischen Front-ends recht verschieden ausgeprägt und stehen nichtim Zentrum des Themas dieses Lehrmoduls; wir werden daher hier nurdie Kommandozeilen-Schnittstelle vorstellen.

2.3 Das Kommando cvs

In UNIX- bzw. Linux-Systemen besteht die gesamte Kommandozeilen-Schnittstelle aus einem einzigen Programm namens cvs . Der ersteStellungsparameter dieses Programms gibt die auszuführende CVS-Operation an, z.B. checkout, die weiteren Parameter beziehen sichdann auf die gewählte Operation. Insgesamt hat der Aufruf folgendeForm:

cvs [cvs-optionen3] cvs-operation [cvs-op-optionen] {Parameter ... }3Als Option bezeichnet man i.d.R. Parameter, die einen Namen haben. Stel-

lungsparameter werden dagegen durch ihre Position in der Parameterliste identi-fiziert. Man benutzt Optionen bei Parametern, für die normalerweise Vorgabewerteausreichen und die nur selten explizit gesetzt werden. In solchen Fällen wären Stel-lungsparameter unpraktisch, weil die Parameterlisten extrem lang würden und beiAufrufen fast alle Positionen Leerwerte enthielten. Hierzu ein Beispiel: Das UNIX-Kommando ls listet die Namen der Dateien im aktuellen Verzeichnis auf. Mit derOption -l, also mit dem Aufruf ls -l, wird eine ausführliche Beschreibung jederDatei geliefert. Der Wertebereich dieses Parameters ist Boolean, Vorgabewert istfalse. Durch die Angabe von -l wird der Wert auf true gesetzt.

Bei den meisten Optionen ist der Wertebereich Boolean, es sind aber im Prinzipbeliebige Wertebereiche möglich, z.B. Texte oder Zahlen. In solchen Fällen wird dergewünschte Wert hinter dem Optionsbezeichner als eigenes Wort in der Komman-

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 7

Beispiele für CVS-Operationen sind login, checkout, edit, commit,add und update; diese werden wir i.f. an Beispielen erläutern. Der volleFunktionsumfang von CVS ist sehr komplex; wir können hier nur einenBruchteil davon vorstellen. Vollständige Beschreibungen finden sich inder on-line-Dokumentation in Linux-Systemen (Kommando: info cvs)sowie in [Ce01]. Ferner werden auf http://www.cvshome.org/docsweitere Materialien angeboten.

3 Das Repository

3.1 Konzeptioneller Inhalt eines Repositorys

Konzeptionell enthält ein CVS-Repository einen Dateibaum, die Blät-ter darin – i.f. als “Dateien” bezeichnet – sind Dokumente, die i.a. inmehreren Versionen vorhanden sind. Verzeichnisse werden nicht explizitversioniert.

Dateien haben Namen, wie in Dateisystemen üblich. Alle Versioneneiner Datei haben den gleichen Namen; Versionen einer Datei werdendurch eine Versionsnummer unterschieden. Die Versionsnummer istnicht Teil des Dateinamens.

In einem Arbeitsbereich eines Entwicklers liegen Kopien von ei-nem oder mehreren Teilbäumen des Repositorys. Die CVS-Operationenarbeiten meist mit ganzen Teilbäumen, d.h. man braucht nicht jedeenthaltene Datei einzeln zu behandeln.

Der Arbeitsbereich enthält von jeder Datei i.d.R. nur eine Versi-on, die den gleichen Dateinamen wie im Repository hat. Es muß nichtunbedingt die neuste Version sein. Man erkennt also am Dateinamennicht, um welche Version es sich handelt. CVS merkt sich in bestimmtenHilfsdaten4, welche Version einer Datei im Arbeitsbereich vorliegt.

dozeile angegeben. Beim Kommando ls kann z.B. die Breite der Ausgabe mit derOption -w angegeben werden. Mit ls -w 40 werden die Ausgaben so formatiert,daß sie in ein 40 Zeichen breites Fenster passen.Eine ausführlichere Darstellung findet sich in [KSP].4Jeder Arbeitsbereich enthält ein Verzeichnis namens CVS, in dem diese Hilfs-

daten gespeichert werden. Dieses Verzeichnis darf nur durch cvs selbst verändertwerden.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 8

Numerierung von Versionen. CVS benutzt folgendes Schema zurNumerierung von Versionen:

Beim Anlegen einer Datei erhält diese als erstes die Nummer 1.1.Wenn eine neue Revision einer Datei angelegt wird, wird die hintersteZiffer um 1 hochgezählt. Nach 1.1 kommen also die Versionsnummern1.2, 1.3, 1.4 usw.

Wenn von einer Datei mit Versionsnummer x.y eine erste Varianteangelegt wird, bekommt diese die Versionsnummer x.y.2.1. Die ersteVariante von Version 1.9 hat also die Nummer 1.9.2.1. Varianten exi-stieren bekanntlich parallel; wenn von unserer Variante neue Versionenangelegt werden, gilt das oben Gesagte, d.h. es werden die Nummern1.9.2.2, 1.9.2.3 usw. vergeben.

Man kann mehrere Varianten zu einer Version anlegen. Die zweiteVariante bekommt als Nummer x.y.4.1, in unserem Beispiel also 1.9.4.1,die dritte Variante 1.9.6.1 usw. Die ungeraden Ziffern werden nichtbenutzt, sondern für interne Zwecke verwendet.

Jede Variante kann unabhängig Revisionen bilden, es entstehen soparallele Entwicklungszweige. Bild 2 zeigt ein Beispiel. Die horizontalenPfeile zeigen auf Nachfolge-Revisionen, die vertikalen auf Varianten.

1.9.4.1

1.9.2.2

1.8 1.111.101.9

1.9.2.1 1.9.2.3 ....

....

1.9.4.2 ....

Abbildung 2: Beispiel eines Versionsgraphen

Eine gewisse Ungerechtigkeit liegt darin, daß die Varianten 1.9,1.9.2.1, 1.9.4.1 usw. zwar im Prinzip alle gleichberechtigt sind, daß aberdie Ursprungsversion, die zuerst existierte, eine um 2 Stellen kürzereNummer hat. Daran kann man nichts ändern.

Man kann nach dem gleichen Schema auch noch Untervarianten bil-

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 9

den, z.B. indem man von Version 1.9.2.2 die erste Variante 1.9.2.2.2.1bildet.

3.2 Realisierung eines Repositorys

Ein Repository wird bei CVS durch ein Verzeichnis realisiert, das di-verse Dateien und Unterverzeichnisse enthält. Diese interne Strukturinteressiert uns jetzt nicht.

In diesem Verzeichnis legt cvs alle Versionen der Dokumente, diesich unter Versionskontrolle befinden, und alle sonstigen, für interneZwecke benötigten Daten ab. Der Inhalt dieses Verzeichnisses sollteallein durch cvs verändert werden.

Typischerweise unterscheiden sich aufeinanderfolgende Revisioneneines Dokument nur an wenigen Stellen voneinander. So könnte z.B.in einem Text von 100 Zeilen nur eine Zeile geändert oder eingefügtworden sein. CVS (genauer gesagt das intern verwendete RCS) nutztdiesen Sachverhalt intern zu einer Optimierung dahingehend aus, daßnur die Differenzen der Dateien gespeichert werden und nicht jedesmalder komplette Text.

3.3 Bezeichnung eines Repositorys

Auf einem Rechner und sogar in den Verzeichnissen eines einzelnen Be-nutzers können beliebig viele CVS-Repositories angelegt werden. Daherbenötigt cvs eine Angabe, mit welchem Repository gearbeitet werdensoll.

Ein lokales Repository wird angegeben durch den absoluten Pfad-namen des Repositoryverzeichnisses.

Bei einem entfernten Repository muß der Name des Rechners an-gegeben werden, auf dem das Repository gespeichert ist, sowie derabsolute Pfadname des Repositoryverzeichnisses auf diesem entfern-ten Rechner. Diese beiden Namen werden mit weiteren Angaben, diewir anschließend bei der login-Operation erläutern werden, zu einereinzigen Zeichenkette zusammengefaßt.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 10

3.4 Übergabe der Repositorybezeichnung an cvs

Da man meist nur mit einem bestimmten Repository arbeitet, wäre eslästig, dieses bei jedem Aufruf angeben zu müssen. Stattdessen kanndas Repository in der Umgebungsvariablen5 CVSROOT übergeben wer-den. In der auf UNIX-Systemen verbreiteten c-Shell (csh) oder dertc-Shell (tcsh) wäre folgendes Kommando einzugeben, um cvs an-zuzeigen, daß mit dem Repository im lokal vorhandenen Verzeichnis/home/schmitz/pg/archiv gearbeitet werden soll:

setenv CVSROOT /home/schmitz/pg/archiv

In der ba-Shell (bash) ist folgendes einzugeben6:

export CVSROOT=/home/schmitz/pg/archiv

Das Repository kann aber auch beim Aufruf von cvs mittels derOption -d angegeben werden:

cvs -d /home/schmitz/pg/archiv .....

3.5 cvs login

Bei einem entfernt zugreifbaren Repository könnten Unberechtigte ver-suchen, auf das Repository zuzugreifen. Daher wird der Zugang nureinzelnen Benutzern erlaubt, die sich durch ein Paßwort ausweisen müs-sen. Hierzu dient die CVS-Operation cvs login; das Paßwort mußinteraktiv eingegeben werden, es wird intern aufbewahrt und anschlie-ßend bei jedem Zugriff benutzt (auch über mehrere Rechnersitzungenhinweg). Mit cvs logout kann das Paßwort wieder gelöscht werden.

5Umgebungsvariablen sind eine weitere Technik, mit der in UNIX-Betriebssyste-men Parameter von einem Prozeß an einen Kind-Prozeß übergeben werden können.Eine Umgebungsvariable hat einen Namen und einen Wert. Ein Prozeß kann Umge-bungsvariablen erzeugen und ihren Wert setzen. Ein von diesem Prozeß gestartetesProgramm erbt die Umgebungsvariablen und kann deren Werte dann lesen.

6Anstatt dieses Kommando bei jeder Sitzung erneut einzugeben ist es bequemer,es in die Datei $HOME/.bashrc bzw. $HOME/.cshrc einzutragen; die Umgebungsva-riable ist dann automatisch in jeder Sitzung gesetzt.Den gleichen Effekt erzielt man bei den meisten graphischen Front-ends, indem

man die Repositorybezeichnung in den Voreinstellungen einträgt.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 11

Der Benutzername, unter dem man sich einloggen möchte, wird ineiner erweiterten Form des Repository-Namens angegeben (man kanngeteilter Meinung sein, ob das besonders elegant ist). Dies gilt auch fürdas Kommunikationsprotokoll, das zur Kommunikation zwischen CVS-Front-end und CVS-Server verwendet werden soll. Z.B. bedeutet derWert

:pserver:[email protected]:/home/schmitz/pg/archiv

in CVSROOT, daß mittels des pserver-Protokolls7 Verbindung mit demRechner xyz.abc.de aufgenommen werden soll, und zwar für den dortbekannten Benutzer karl.

4 Anlegen eines Repositorys

Ziel der folgende Abschnitte ist, die wichtigsten CVS-Operationen anBeispielen zu erklären. Die einzelnen dabei benutzten CVS-Operationenwerden nicht im Detail erklärt - hierzu sei auf [Ce01] und die on-line-Dokumentation verwiesen. Das Ziel ist vielmehr, einen ersten Überblickzu geben und das Zusammenspiel der CVS-Operationen klarzumachen.

Es ist sinnvoll, die gezeigten Beispiele an einem Rechner praktischnachzuvollziehen8. Hierzu benötigt man ein installiertes Repository.Erst nachdem ein Repository vorhanden ist, können Arbeitsbereicheeingerichtet werden (mit Hilfe der Operation checkout).

Das Einrichten eines verteilt zugreifbaren Repositorys ist kompliziertund kein Lernziel dieses Lehrmoduls. Sofern kein zentrales vorkonfek-tioniertes Repository verfügbar ist oder man auf einem nicht vernetztenRechner üben will, muß mit einem lokalen Repository gearbeitet wer-den. Nachfolgend zeigen wir an einem Beispiel, wie ein Repository lokalinitialisiert werden kann. Die Kommandos unterstellen die bash alsKommandointerpreter.

7Es gibt weitere Protokolle, die wir hier aber nicht betrachten.8Über die WWW-Seite zu diesem Lehrmodul ist ein Shell-Skript erhältlich, das

eine Sequenz von Kommandos mit Erläuterungen durchführt.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 12

1. Erzeugen eines leeren Repositorys. Im Beispiel legen wir dasRepository im home-Verzeichnis unter dem Namen archiv an:

export CVSROOT=$HOME/archivcvs init

Die CVS-Operation init erzeugt im angegebenen Verzeichnis ein leeresRepository.

2. Anlegen einer initialen Verzeichnisstruktur im Repository.Angenommen, wir wollen die Programmquelltexte in einem Verzeich-nis src speichern, die Dokumentation in einem Verzeichnis docs, darinzwei Unterverzeichnisse docs/handbuch und docs/install für das Be-nutzerhandbuch und die Installationsanweisungen. Wir legen zunächstan einer beliebigen Stelle im Dateisystem ein Hilfsverzeichnis initdirsan und erzeugen dort die gewünschten Verzeichnisse:

mkdir initdirsmkdir initdirs/docsmkdir initdirs/docs/handbuchmkdir initdirs/docs/installmkdir initdirs/src

Diese Struktur können wir nun mit Hilfe der CVS-Operation import indas Repository übernehmen. Dies überträgt die Inhalte des Verzeich-nisses, in dem sie aufgerufen wird, in das Repository. Wir müssen alsozunächst in unser Hilfsverzeichnis initdirs hineinnavigieren:

cd initdirscvs import -m "initiale Verzeichnisstruktur erzeugt" \

ws2003/propra x y

Der Schrägstrich am Ende einer Zeile bedeutet, daß das begonneneKommando in der Folgezeile fortgesetzt wird.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 13

Die Option -m ... (m wie message) erlaubt es, einen Kommentarzu hinterlegen.

Der erste Stellungsparameter ws2003/propra gibt ein Unterver-zeichnis innerhalb des Repositorys an, in dem die Verzeichnisstrukturerzeugt werden soll; sofern noch nicht vorhanden, werden diese Ver-zeichnisse im Repository erzeugt. Auf diese Weise ist es möglich, fürmehrere Arbeitsbereiche, die für unterschiedliche parallele Aktivitätennötig sein mögen, mit einem einzigen Repository auszukommen.

Die beiden folgenden Stellungsparameter (x und y) dürfen nichtfehlen, sind aber im Moment uninteressant.

Man beachte, daß beim bisherigen Stand der Dinge unser Hilfsver-zeichnis initdirs nicht automatisch zu einem Arbeitsbereich gewordenist. Es wird nicht weiter benötigt und kann gelöscht werden.

5 Anlegen von Arbeitsbereichen

Zu einem Repository können bekanntlich mehrere Arbeitsbereicheangelegt werden. In unserem Beispiel wollen wir im Verzeichnis$HOME/arbeit zwei Arbeitsbereiche ab1 und ab2 anlegen. Norma-lerweise gehören Arbeitsbereiche zu verschiedenen Entwicklern. Umdas Beispiel einfacher nachvollziehbar zu machen, führen wir hier alleOperationen unter einem einzigen Benutzer aus. Die CVS-Operationenkönnten aber ebensogut in jedem Arbeitsbereich von einem anderenEntwickler durchgeführt werden. Wir legen zunächst entsprechendeleere Verzeichnisse an:

mkdir $HOME/arbeitmkdir $HOME/arbeit/ab1mkdir $HOME/arbeit/ab2

Anlegen können wir einen Arbeitsbereich mit der CVS-Operationcheckout (abgekürzt co). Als impliziten Parameter hat auch diesedas Verzeichnis, in dem sie aufgerufen wird: in diesem Verzeichnis

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 14

werden die CVS-Dateien für einen Arbeitsbereich angelegt oder, so-fern schon vorhanden, korrigiert. Wir müssen also in unseren erstenArbeitsbereich wechseln:

cd $HOME/arbeit/ab1cvs checkout -d . ws2003/propra

Der Parameter ws2003/propra bezeichnet den Teilbaum des Reposito-rys, der hierhin kopiert werden soll. Ohne die Option -d . würden dievollen Pfadnamen des Repositorys auch im Dateisystem erzeugt, alsoz.B. das Verzeichnis

$HOME/arbeit/ab1/ws2003/propra/docs/handbuch

Die Option -d . bewirkt, daß nur die “lokalen” Pfadnamen vonws2003/propra aus erzeugt werden. Statt des vorstehenden Verzeich-nisses entsteht somit:

$HOME/arbeit/ab1/docs/handbuch

6 Anlegen von Verzeichnissen und Dateien imRepository

Anlegen vn Textdateien Angenommen, wir wollen nun im Ver-zeichnis docs/handbuch die Datei hb.txt erstellen und unter Versions-kontrolle nehmen. Hierzu benutzt man die CVS-Operationen add undcommit. add merkt eine Datei nur zur Eintragung in das Repositoryvor, eingetragen wird die Datei erst nach dem commit. Beide Komman-dos müssen im jeweils betroffenen Verzeichnis ausgeführt werden; wirnavigieren also in unserem Beispiel zunächst dorthin:

cd docs/handbuchecho ’aller Anfang ist schwer’ > hb.txtcvs add hb.txtcvs commit -m ’die erste Zeile’ hb.txt

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 15

Beim commit-Kommando kann man i.d.R. auf die Angabe der Da-tei verzichten. Ist keine Datei angegeben, durchsucht CVS das aktuelleArbeitsverzeichnis und dessen Unterverzeichnisse nach Dateien, die zurEintragung in das Repository vorgemerkt sind, und führt alle Eintra-gungen durch.

Binärdateien. Unter Binärdateien verstehen wir Dateien, in denennicht darstellbare Byteinhalte vorkommen. Beispiele sind die gängigenFormate für Bilder, Spreadsheets und mit gzip komprimierte Dateien.

Wir hatten bisher unterstellt, daß Dateiinhalte bei einem commitvöllig unverändert in das Repository übertragen werden. Dies ist nichtvöllig korrekt, in Wirklichkeit werden bestimmte kleinere Verände-rungen vorgenommen. Eine der Veränderungen besteht darin, dieZeilenendemarkierungen in den Dateien zu vereinheitlichen. Hierzu istanzumerken, daß die Zeilenendemarkierungen in den unterschiedlichenBetriebssystemen nicht einheitlich gehandhabt werden. Würde ein Re-pository von mehreren Rechnern mit verschiedenen Betriebssystemenaus benutzt, ohne die Zeilenendemarkierungen zu vereinheitlichen, sowürden die Algorithmen zur Bildung der Differenzen zwischen Revisio-nen in jeder Zeile eine Änderungen feststellen und nicht mehr sinnvollarbeiten.

In Binärdateien können zufällig auch Folgen von Byteinhalten auf-treten, die identisch mit einer Zeilenendemarkierung sind, aber natürlichkeine solche darstellen. Diese Byteinhalte dürfen offensichtlich nichtgegen eine andere Darstellung eines Zeilenendes ausgetauscht werden,hierdurch würde der Dateiinhalt unbrauchbar werden. Durch die Opti-on -kb in der CVS-Operation add kann erzwungen werden, daß eineDatei völlig unverändert übernommen wird. Wenn wir beispielswei-se von irgendwoher die Bilddatei logo.gif in unseren Arbeitsbereichkopiert hätten, würden wir dieses Bild wie folgt in das Repositoryübernehmen:

cvs add -kb logo.gifcvs commit -m ’neues Bild’ logo.gif

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 16

Anlegen von Verzeichnissen. Im Gegensatz zu Dateien werden(Unter-) Verzeichnisses von add sofort im Repository eingetragen. Nach

mkdir glossarcvs add -m ’ Verzeichnis glossar erzeugt’ glossar

befindet sich also das Verzeichnis docs/handbuch/glossar sofort imRepository (und nicht erst nach dem nächsten commit).

7 Anlegen und Ändern von Dateien in einemArbeitsbereich

7.1 checkout und commit

Das Neuanlegen von Dateien oder Verzeichnissen im Repository ist eherdie Ausnahme. Meist werden Dateien, die schon im Repository vor-handen sind, modifiziert. Hierzu werden sie mit der CVS-Operationcheckout in den Arbeitsbereich kopiert. Nach Beendigung der Än-derung wird die neue Version mit commit wieder in das Repositoryübernommen.

In unserem Beispiel wechseln wir in den zweiten Arbeitsbereich underzeugen dort eine Kopie des kompletten Teilbaums, den wir eben imersten Arbeitsbereich angelegt haben.

cd $HOME/arbeit/ab2cvs checkout -d . ws2003/propra

Wir finden anschließend in $HOME/arbeit/ab2/docs/handbuch unsereDatei hb.txt. Wir navigieren jetzt in dieses Verzeichnis, hängen eineZeile an die Datei an und führen danach wieder ein commit aus:

cd docs/handbuchecho ’nun ja’ >> hb.txtcvs commit -m ’die zweite Zeile’ hb.txt

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 17

CVS meldet uns dann, daß Revision 1.2 von hb.txt eingetragen wordenist.

Um des Beispiels willen erzeugen wir jetzt noch eine weitere Dateiund tragen sie mit add und commit im Repository ein:

echo ’noch ein Text’ > nochn.txtcvs add nochn.txtcvs commit nochn.txt

“Originaldateien”. Da wir jetzt mit der Arbeit an hb.txt fertig sindund der neue Stand im Repository eingetragen ist, können wir, wennwir wollen, hb.txt ohne weiteres löschen, denn wir können sie ja beiBedarf wieder mit einem checkout restaurieren. In der Praxis wirdman dies i.a. nicht tun, das Beispiel soll vielmehr folgendes klarma-chen: Die übliche Denkweise, wonach man seine “Originale” in seinenArbeitsverzeichnissen hat und ggf. an anderer Stelle eine Sicherungsko-pie, wird bei der Benutzung eines Repositorys sozusagen umgekehrt:die “Originale” befinden sich im Repository, die Arbeitsbereiche enthal-ten nur Kopien, die modifiziert sein können. Daher wird eine Datei ineinem Arbeitsbereich, die eine korrespondierende Datei im Repositoryhat, oft als Kopie bezeichnet.

7.2 update

Wir haben nun in unseren beiden Arbeitsbereichen Kopien der glei-chen Dateien aus dem Repository vorliegen, wobei im Arbeitsbereichab1 eine Datei fehlt und eine einen veralteten Stand hat. Aus Sicht desArbeitsbereichs ab1 entspricht dies der Situation, daß jemand andersdie Dokumente inzwischen weiterentwickelt hat und daß die Änderun-gen lokal nachvollzogen werden müssen. Hierzu ist die CVS-Operationupdate verfügbar.

Bei einem Aufruf von update können Dateien oder Verzeichnisseangegeben werden, die auf den neuesten Stand gebracht werden sol-len. Bei Verzeichnissen werden das Verzeichnis und alle direkten und

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 18

indirekten Unterverzeichnisse durchlaufen und alle gefundenen Datei-en behandelt. Sofern die im Arbeitsbereich befindliche Kopie identischmit der neusten Revision im Repository ist, passiert nichts. Andernfallswird eine Korrektur erforderlich, wobei verschiedene Fälle zu unter-scheiden sind. Bezüglich des Zustands der Datei im Arbeitsbereich sindfolgende Fälle von Interesse:

(A) die Datei existiert noch nicht oder nicht mehr im Arbeitsbereich(B) Die Datei existiert im Arbeitsbereich und entsprach bei ihrem

checkout oder dem letzten update oder commit der Revision X.Seit diesem Zeitpunkt können sowohl im Arbeitsbereich als auchim Repository Veränderungen eingetreten sein. Folgende Fälle sinddenkbar:

(1) die Datei im Arbeitsbereich ist unverändert.(2) die Datei im Arbeitsbereich wurde verändert.(a) Revision X ist die letzte im Repository.(b) Revision X ist nicht mehr die letzte im Repository.

Insg. ergeben sich 4 Kombinationen B1a, B1b, B2a und B2b.

CVS reagiert auf diese Fälle wie in der folgenden Tabelle angegeben.Im Fall (B1a) passiert nichts; in den anderen Fällen gibt update einenKennbuchstaben und den Dateinamen aus.

Fall Reaktion Kenn-buchstabe

(A) Datei wird neu erzeugt U(B1a) keine Änderung -(B1b) Datei wird auf den gleichen Stand wie das

Repository gebrachtU

(B2a) keine Änderung M(B2b) automatische Mischung der Änderungen;

hierbei traten ...... keine Mischkonflikte auf M... Mischkonflikte auf C

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 19

Darüber hinaus existieren u.a. die folgenden Meldungen:

A Die Datei wurde im Arbeitsbereich angelegt, muß aber noch mitcommit gesichert werden.

R Die Datei wurde im Arbeitsbereich gelöscht, die Löschung mußaber noch mit commit im Repository nachvollzogen werden.

In unserem Beispiel ändern wir zunächst die Datei hb.txt ab undprovozieren so einen Mischkonflikt. Danach veranlassen wir ein updatefür das komplette Verzeichnis docs:

cd $HOME/ab1echo ’nur Mut!’ >> docs/handbuch/hb.txtcvs update docs

update legt die Datei nochn.txt neu an und mischt die Änderungen inhb.txt; hierbei wird eine Warnung ausgegeben – auf solche Warnun-gen ist zu achten! – und die ursprünglich im Arbeitsbereich vorhandeneDatei unter einem anderen Namen verwahrt. hb.txt hat anschließendfolgenden Inhalt:

aller Anfang ist schwer<<<<<<< hb.txtnur Mut!=======nun ja>>>>>>> 1.2

Oberhalb der Zeile ======= steht der bisher im Arbeitsbereichvorhandene Text, darunter der Text gemäß der letzten Version imRepository.

Option -D. Normalerweise zieht update alle Änderungen nach, dieseit dem Anlegen der Dateien im Arbeitsbereich (bzw. seit dem letztenUpdate) im Repository eingetragen wurden. Dies geht manchmal zuweit. So kann an einem bestimmten Datum ein konsistenter Zustand

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 20

vorhanden gewesen sein, seitdem kann aufgrund nicht abgeschlossenerArbeiten ein inkonsistenter Zwischenzustand im Repository eingetra-gen sein, den nicht jeder sehen möchte. In solchen Fällen kann durchdie Option -D datum bewirkt werden, daß nur die Änderungen bis zudiesem Datum nachvollzogen werden.

7.3 Statusabfragen

Daß unsere Datei hb.txt Revision 1.2 ist, kann man ihr am Dateina-men nicht ansehen. Die Versionsnummer und diverse andere Angabenzum Zustand von Dateien im Arbeitsbereich kann man mit der CVS-Operation status abfragen. Beispiel:

cvs status hb.txt

7.4 remove

Es kann natürlich auch der Fall eintreten, daß wir eine Datei komplettlöschen wollen. Es reicht jetzt nicht mehr aus, die Datei einfach imArbeitsbereich zu löschen, das nächste cvs update würde sie wieder-herstellen. Stattdessen muß sie explizit im Repository gelöscht werden.Hierzu dient die CVS-Operation remove: sie merkt vor, daß die angege-benen Dateien oder Verzeichnisse beim nächsten commit im Repositorygelöscht werden sollen. Vor dem cvs remove müssen die Dateien imArbeitsbereich gelöscht worden sein. Hierzu ein Beispiel (wir unter-stellen, daß die Datei versuch1.java vorher mit add und commit imRepository eingetragen worden ist):

rm versuch1.javacvs remove versuch1.javacvs commit versuch1.java

8 Überwachung paralleler Änderungen

Obwohl CVS Sperren nicht direkt unterstützt, bietet es Mechanismenan, durch die bei entsprechender Disziplin der Entwickler verhindert

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 21

werden kann, daß mehrere Entwickler die gleiche Datei editieren.Die Überwachung paralleler Änderungen kann für einzelne Datei-

bäume des Repositorys ein- und ausgeschaltet werden. Hierzu dient dieCVS-Operation watch

cvs watch on [-l] [-R] dateien ....

Diese CVS-Operation schaltet die Überwachung für die angegebenenDateien und Verzeichnisse ein. Wenn ein Verzeichnis angegeben wird,wird dort überwacht, ob neue Dateien angelegt werden; für die neuenDateien wird die Überwachung automatisch eingeschaltet. Normaler-weise arbeitet watch rekursiv, wenn also ein Verzeichnis angegebenwird, auch auf allen direkt oder indirekt enthaltenen Verzeichnissenund Dateien. Das rekursive Arbeiten kann durch die Option -l (l wielokal) abgeschaltet werden. CVS kann aber auch so konfiguriert wer-den, daß das lokale Arbeiten voreingestellt ist; in diesem Fall bewirktdie Option -R, daß rekursiv gearbeitet wird.

Abgeschaltet werden kann die Überwachung durch

cvs watch off [-l] [-R] dateien ....

Die Optionen und Parameter werden hier genauso behandelt wie beiwatch on.

Die Überwachung ändert die Wirkung des checkout: während die-ses bisher Dateien im Arbeitsbereich mit Lese- und Schreibrechtenanlegte, werden nun nur noch Leserechte eingeräumt.

Wenn ein Entwickler nun eine Datei verändern möchte, muß ervorher eine weitere CVS-Operation aufrufen: edit9. Beispiel:

cvs edit hb.txt ...9Man kann natürlich auch die Rechte direkt im Dateisystem ändern und die CVS-

Mechanismen so unterlaufen, d.h. die CVS-Mechanismen sind in dieser Hinsichtnicht sicher.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 22

Diese Operation hat folgende Effekte:

- Alle Entwickler, die die angegebene Datei überwachen, werden vonder geplanten Änderung informiert. Das CVS-System ist so konfigu-rierbar, daß den betroffenen Benutzern eine elektronische Nachrichtgeschickt wird (dies ist allerdings nicht voreingestellt).

- Der Benutzer, der cvs edit aufgerufen hat, wird ab sofort vonÄnderungen anderer Entwickler an der Datei informiert.

- Es werden Schreibrechte an den Dateien eingeräumt.

Die Datei kann nunmehr verändert werden, und der neue Standkann wie üblich mit commit in das Repository übertragen werden. Dascommit zeigt das Ende der Bearbeitung an, daher werden als Seitenef-fekt die Schreibrechte wieder entfernt, ferner wird der Entwickler vonÄnderungen anderer Entwickler an der Datei nicht mehr benachrichtigt,

Sofern aus irgendeinem Grund die Bearbeitung der Datei ohnecommit abgebrochen werden muß, ist die CVS-Operation unedit zubenutzen. Diese hat folgende Effekte:

- Die angegebenen Dateien werden auf den Zustand zurückgesetzt,den sie beim letzten commit, update bzw. checkout hatten.

- Die Benachrichtigung über Änderungen anderer Entwickler an derDatei wird aufgehoben.

- Die Schreibrechte an den Dateien werden wieder entzogen.

9 Benutzungsregeln

In den bisherigen Abschnitten wurden die wichtigsten Funktionen vonCVS eingeführt, wobei offen blieb, wie sie sinnvoll und systematischeingesetzt werden sollten. Als Abschluß folgen daher einige Benut-zungsregeln:

1. Man sollte so oft wie möglich die Dateien in einem privaten Ar-beitsbereich mit update auf den neuesten Stand bringen. Dies giltbesonders für Dokumente, die bisher noch unverändert sind und

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 23

jetzt bearbeitet werden sollen; sie könnten seit dem checkout vonjemand anderem verändert worden sein.

2. Es sollten nur compilierfähige Programme bzw. allgemeiner gesagthinreichend konsistente Dokumente in das Repository eingetragenwerden. Der notwendige Grad an Konsistenz hängt vom Dokument-typ und ggf. vom Arbeitsstil einer Gruppe ab. Jedenfalls muß nacheiner Eintragung immer damit gerechnet werden, daß ein anderesGruppenmitglied diese Revision als Basis eigener Arbeiten benutzt.

3. Neue Zustände von Dokumenten sollten möglichst früh in das Repo-sitory eingetragen werden.

Dies sieht auf den ersten Blick wie ein Widerspruch zur vorherigenRegel aus, ist es aber nicht. Beide Regeln zusammen bedeuten, daßman umfangreichere Änderungen möglichst in eine Folge kleinererÄnderungen aufteilt, die jeweils zu einem konsistenten Zwischen-zustand führen. Dahinter steckt die ganz generelle Lebensweisheit,nicht parallel an vielen Problemen herumzubasteln, sondern sich aufwenige Dinge zu konzentrieren und diese zügig zum Abschluß zubringen.

4. Arbeitsgruppen, die noch wenig Erfahrung in Teamarbeit haben –hierzu zählen insbesondere Gruppen in Programmierpraktika undstudentische Projektgruppen – sollten systematisch edit und unediteinsetzten, um unkontrollierte Parallelarbeit am gleichen Doku-ment zu verhindern. Der Mehraufwand zum Aufruf dieser CVS-Operationen ist vergleichsweise gering, während die Behebung in-kompatibler Änderungen viel Zeit kosten und Ärger verursachenkann.

5. CVS macht Planung und Kommunikation in der Gruppe nicht über-flüssig. Wenn es häufig dazu kommt, daß verschiedene Entwicklerdas gleiche Dokument bearbeiten und vielleicht sogar Mischkonflikteauftreten, kann eine schlechte Modularisierung des Systems und ei-ne ungeschickte Arbeitsaufteilung die Ursache sein; ein KMS machtsolche Planungsfehler nur sichtbar, beheben kann es sie nicht.

c©2003 Udo Kelter Stand: 09.03.2003

Einführung in CVS 24

Literatur

[Ce01] Cederqvist, Per: Version management with CVS (v1.11.1p1);2001 (in verschiedenen Formaten auf http://www.cvshome.-org/docs/ erhältlich)

[Ti85] Tichy, Walter F.: RCS - a system for version control; Software -Practice & Experience 15:7, p.637-654; 1985/07

[KM] Kelter, U.: Lehrmodul “Einführung in das Konfigurationsmana-gement”; 2003

[KSP] Kelter, U.: Lehrmodul “Kommandosprachen und Shell-Program-mierung”; 1988

Glossar

cvs add: CVS-Operation zum Anlegen neuer Dateien im Repositorycvs checkout: CVS-Operation zum Ausbuchen von Dateiencvs commit: CVS-Operation zum Bestätigen von Änderungencvs edit: CVS-Operation, mit der man ankündigen kann, daß eine Datei

editiert werden sollcvs remove: CVS-Operation zum Löschen von Dateien im Repositorycvs status: CVS-Operation zur Anzeige des Zustands von Dateien in einem

Arbeitsbereichcvs update: CVS-Operation, mit der Dateien, die sich im Arbeitsbereich

befinden, auf den neuesten Stand gemäß Repository gebracht werdenkönnen; eine Variante von update erlaubt es, Varianten von Dateienzu mischen

cvs watch: CVS-Operation, mit der die Überwachung von Dateien und Ver-zeichnissen ein- und ausgeschaltet werden kann

CVSROOT: Umgebungsvariable, die den Namen des von cvs zu benutzendenRepositorys enthält

Repository (im Kontext von CVS): Synonym zu Versionsarchiv; technischgesehen der Name eines Verzeichnisses

c©2003 Udo Kelter Stand: 09.03.2003

IndexArbeitsbereich, 13Arbeitsplanung, 23Archiv, siehe Repository

Benachrichtigung, 20Binärdateien, 14

Concurrent Versions System, 3CVS, 3

Arbeitsbereich, 11Benutzungsregeln, 22Front-end, 3, 4, 5

graphisches, 5Kommandozeilen-Schnittstelle, 5

cvs, 6add, 14, 16, 23checkout, 13, 16, 21, 23co, 13commit, 14, 15, 16, 21, 23CVSROOT, 10edit, 21, 22, 23import, 12init, 11login, 10logout, 10remove, 20, 23Repositorybezeichnung, 10status, 19, 24unedit, 21update, 17, 19, 22, 24

Kennbuchstaben, 18watch, 20, 24

CVSROOT, 24

Differenzen, 6, 9

KMS, 3

Konfigurationsmanagement∼system, 3

Kooperation, 22Kopie, 17

Mischkonflikt, 18, 23Darstellung, 19

Option, 6

parallele Änderungen, 20

RCS, 3, 9Repository, 4, 24

Aktualisierung, 17Anlegen, 11Anlegen von Dateien, 14Anlegen von Verzeichnissen, 15Bezeichnung, 9entfernter Zugriff, 3, 4, 9konzeptioneller Inhalt, 7leeres, 11Realisierung, 9

Revision, 8, 17

Sperre, 3, 20Stellungsparameter, 6

Variante, 8Versionsnummer, 7

Zeilenendemarkierung, 14

25