26.12.2013 Aufrufe

Einführung in CVS - Praktische Informatik

Einführung in CVS - Praktische Informatik

Einführung in CVS - Praktische Informatik

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong><br />

Udo Kelter<br />

09.03.2003<br />

Zusammenfassung dieses Lehrmoduls<br />

Das Concurrent Versions System (<strong>CVS</strong>) ist e<strong>in</strong>es der bekanntesten<br />

und am meisten verbreiteten Konfigurationsmanagementsysteme. Dieses<br />

Lehrmodul beschreibt zunächst die Architektur des Systems und<br />

grundlegende Funktionsmerkmale, u.a. den konzeptuellen Aufbau e<strong>in</strong>es<br />

<strong>CVS</strong>-Repositories. Anhand e<strong>in</strong>es Beispiels wird die Benutzung<br />

der wichtigsten <strong>CVS</strong>-Operationen e<strong>in</strong>führend dargestellt. Abschließend<br />

werden e<strong>in</strong>ige Richtl<strong>in</strong>ien angegeben, wie <strong>CVS</strong> benutzt werden<br />

sollte.<br />

Vorausgesetzte Lehrmodule:<br />

obligatorisch: – <strong>E<strong>in</strong>führung</strong> <strong>in</strong> das Konfigurationsmanagement<br />

Stoffumfang <strong>in</strong> Vorlesungsdoppelstunden: 1.0<br />

1


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 2<br />

Inhaltsverzeichnis<br />

1 E<strong>in</strong>leitung 3<br />

2 Grobarchitektur 4<br />

2.1 Verteilungsarchitektur . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.2 Programm- und Bedienschnittstellen . . . . . . . . . . . . . . 5<br />

2.3 Das Kommando cvs . . . . . . . . . . . . . . . . . . . . . . . 6<br />

3 Das Repository 7<br />

3.1 Konzeptioneller Inhalt e<strong>in</strong>es Repositorys . . . . . . . . . . . . 7<br />

3.2 Realisierung e<strong>in</strong>es Repositorys . . . . . . . . . . . . . . . . . . 9<br />

3.3 Bezeichnung e<strong>in</strong>es Repositorys . . . . . . . . . . . . . . . . . 9<br />

3.4 Übergabe der Repositorybezeichnung an cvs . . . . . . . . . 10<br />

3.5 cvs log<strong>in</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

4 Anlegen e<strong>in</strong>es Repositorys 11<br />

5 Anlegen von Arbeitsbereichen 13<br />

6 Anlegen von Verzeichnissen und Dateien im Repository 14<br />

7 Anlegen und Ändern von Dateien <strong>in</strong> e<strong>in</strong>em Arbeitsbereich 16<br />

7.1 checkout und commit . . . . . . . . . . . . . . . . . . . . . . 16<br />

7.2 update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

7.3 Statusabfragen . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

7.4 remove . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

8 Überwachung paralleler Änderungen 20<br />

9 Benutzungsregeln 22<br />

Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

Glossar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

c○2003 Udo Kelter Stand: 09.03.2003<br />

Dieser Text darf für nichtkommerzielle Nutzungen als Ganzes und unverändert <strong>in</strong> elektronischer oder<br />

gedruckter Form beliebig weitergegeben werden und <strong>in</strong> WWW-Seiten, CDs und Datenbanken aufgenommen<br />

werden. Jede andere Nutzung, <strong>in</strong>sb. die Veränderung und Überführung <strong>in</strong> andere Formate, bedarf<br />

der expliziten Genehmigung. Die jeweils aktuellste Version ist über http://kltr.de erreichbar.


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 3<br />

1 E<strong>in</strong>leitung<br />

Das Concurrent Versions System (<strong>CVS</strong>) ist e<strong>in</strong>es der bekanntesten<br />

und verbreitetsten Konfigurationsmanagementsysteme (KMS).<br />

Se<strong>in</strong>en Erfolg verdankt es mehreren Vorteilen gegenüber anderen KMS:<br />

– Es ist als public-doma<strong>in</strong>-Software frei verfügbar.<br />

– Es ist für alle gängigen Plattformen erhältlich. Für die Bedienschnittstellen<br />

s<strong>in</strong>d plattformspezifische Varianten verfügbar, die an<br />

das jeweilige look and feel der Plattform angepaßt s<strong>in</strong>d.<br />

– <strong>CVS</strong> unterstützt den lokalen und entfernten Zugriff auf e<strong>in</strong> Archiv.<br />

Beim entfernten Zugriff werden diverse Protokolle und Verfahren<br />

zum E<strong>in</strong>loggen auf den Server und Transfer der Daten unterstützt.<br />

– <strong>CVS</strong> wurde und wird <strong>in</strong> sehr vielen Projekten e<strong>in</strong>gesetzt und hat<br />

sich <strong>in</strong> der Praxis <strong>in</strong> doppelter H<strong>in</strong>sicht bewährt: Es läuft äußerst<br />

stabil, und se<strong>in</strong> Funktionsumfang und die Auslegung der Basisfunktionalitäten<br />

s<strong>in</strong>d alltagstauglich.<br />

Der Funktionsumfang von <strong>CVS</strong> deckt natürlich alle Grundfunktionalitäten<br />

e<strong>in</strong>es KMS ab. H<strong>in</strong>zu kommen diverse Adm<strong>in</strong>istrationsfunktionen.<br />

E<strong>in</strong> wichtiges Merkmal von <strong>CVS</strong> besteht dar<strong>in</strong>, daß die Sperrung<br />

von Dokumenten beim Checkout aus e<strong>in</strong>em Archiv nicht direkt unterstützt<br />

wird. In <strong>CVS</strong> ist die Strategie, e<strong>in</strong> Dokument beim Checkout<br />

aus e<strong>in</strong>em Archiv nicht zu sperren, e<strong>in</strong>deutig bevorzugt. Die Vor- und<br />

Nachteile beider Strategien – zu sperren bzw. Varianten zuzulassen<br />

und i.d.R. automatisch zu mischen –, s<strong>in</strong>d <strong>in</strong> Abschnitt 2.6 <strong>in</strong> [KM]<br />

schon diskutiert worden und sollen hier nicht wiederholt werden.<br />

E<strong>in</strong>ige graphische Front-ends für <strong>CVS</strong> bilden Sperren oberhalb der<br />

Kernfunktionalität nach, wobei nicht immer klar ist, wie sicher solche<br />

Implementierungen s<strong>in</strong>d.<br />

Intern benutzt <strong>CVS</strong> <strong>in</strong>tensiv RCS (Revision Control System). Mit<br />

RCS können Versionen e<strong>in</strong>er Datei lokal verwaltet werden. Von RCS<br />

stammen manche Meldungen, die bei der Benutzung von <strong>CVS</strong> ausgegeben<br />

werden.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 4<br />

2 Grobarchitektur<br />

2.1 Verteilungsarchitektur<br />

Bzgl. der Grobarchitektur muß unterschieden werden, ob das Versionsarchiv<br />

(das Repository <strong>in</strong> der Begriffswelt von <strong>CVS</strong>) lokal, also<br />

auf dem gleichen Dateisystem, auf dem auch der Entwickler arbeitet,<br />

oder entfernt existiert 1 .<br />

Bei e<strong>in</strong>em lokalen Versionsarchiv können die von e<strong>in</strong>em Entwickler<br />

aufgerufenen <strong>CVS</strong>-Befehle direkt auf dem Archiv arbeiten.<br />

Bei e<strong>in</strong>em entfernten Versionsarchiv muß auf der Seite des Rechners,<br />

der das Versionsarchiv enthält, e<strong>in</strong> Serverprozeß laufen, der über<br />

Netzwerkverb<strong>in</strong>dungen ansprechbar ist und die ihm übermittelte <strong>CVS</strong>-<br />

Operation ausführt. Auf dem Rechner, an dem der Entwickler arbeitet,<br />

muß e<strong>in</strong> Programm (das “<strong>CVS</strong>-Front-end”) verfügbar se<strong>in</strong>, das<br />

mit dem Benutzer kommuniziert, die Verb<strong>in</strong>dung zum Serverprozeß<br />

herstellt und die Kommunikation mit dem Serverprozeß abwickelt, s.<br />

Bild 1.<br />

Arbeitsplatzrechner<br />

Server<br />

Entwickler<br />

<strong>CVS</strong>-<br />

Front-end<br />

Repository<br />

Arbeitsbereich<br />

<strong>CVS</strong>-Server-<br />

Prozeß<br />

Abbildung 1: Front-end und <strong>CVS</strong>-Server<br />

1 Bei verteilten Dateisystemen wie NFS können Dateisysteme, die <strong>in</strong> Wirklichkeit<br />

auf e<strong>in</strong>em Server gespeichert s<strong>in</strong>d, bei anderen Rechnern – typischerweise Arbeitsplatzrechnern<br />

– e<strong>in</strong>gespiegelt werden. Auf den Arbeitsplatzrechnern bemerkt man<br />

abgesehen von der Performance und e<strong>in</strong>igen speziellen Details ke<strong>in</strong>en Unterschied<br />

zwischen lokal gehaltenen und e<strong>in</strong>gespiegelten Dateisystemen. E<strong>in</strong> Versionsarchiv,<br />

das <strong>in</strong> e<strong>in</strong>em e<strong>in</strong>gespiegelten Dateisystem liegt, ist im S<strong>in</strong>ne von <strong>CVS</strong> daher e<strong>in</strong> lokal<br />

vorhandenes Archiv, obwohl es nicht wirklich auf e<strong>in</strong>er lokalen Platte gespeichert<br />

ist.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 5<br />

Bei e<strong>in</strong>em entfernten Zugriff entstehen durch die Rechnerkommunikation<br />

diverse Probleme bzgl. der Sicherheit und der Auswahl<br />

der Kommunikationsprotokolle; auf diese Fragen gehen wir hier nicht<br />

näher e<strong>in</strong>. Es dürfte nicht überraschen, daß das E<strong>in</strong>richten e<strong>in</strong>es entfernt<br />

zugänglichen <strong>CVS</strong>-Repositorys kompliziert ist und Grundwissen<br />

über Rechnernetzwerke erfordert.<br />

E<strong>in</strong> besonders positiver Aspekt von <strong>CVS</strong> ist, daß im normalen Betrieb,<br />

sobald das Repository e<strong>in</strong>gerichtet ist, praktisch ke<strong>in</strong> Unterschied<br />

zwischen e<strong>in</strong>em lokalen und e<strong>in</strong>em entfernten Archiv zu bemerken<br />

ist.<br />

2.2 Programm- und Bedienschnittstellen<br />

<strong>CVS</strong> ist e<strong>in</strong> Datenverwaltungssystem <strong>in</strong> dem S<strong>in</strong>ne, daß es e<strong>in</strong>en Datenbestand<br />

– e<strong>in</strong> <strong>CVS</strong>-Repository – e<strong>in</strong>kapselt 2 und nach außen h<strong>in</strong><br />

bestimmte Operationen exportiert, die auf diesem Datenbestand operieren.<br />

Diese Operationen s<strong>in</strong>d sowohl von Entwicklungswerkzeugen<br />

(<strong>in</strong>sb. Editoren) aus aufrufbar wie auch durch selbständige Programme,<br />

die Entwicklern e<strong>in</strong>e Bedienschnittstelle anbieten.<br />

Das orig<strong>in</strong>äre <strong>CVS</strong>-System enthält “nur” e<strong>in</strong>e Kommandozeilen-<br />

Schnittstelle. Für Anfänger, deren Erfahrung mit Rechnern durch<br />

Spiele oder Büropakete geprägt ist, s<strong>in</strong>d solche Bedienschnittstellen<br />

ungewohnt. Für professionellere Anwender s<strong>in</strong>d Kommandozeilen-<br />

Schnittstellen dagegen wichtiger als graphische Schnittstellen, da sie<br />

oft effizienter bedient werden können und <strong>in</strong>sb. weil man durch sie<br />

<strong>CVS</strong>-Operationen <strong>in</strong>nerhalb von Shell-Skripten aufrufen kann; Shell-<br />

Skripten dienen meist zur Automatisierung umfangreicherer Arbeitsvorgänge.<br />

Zusätzlich zur Kommandozeilen-Schnittstelle stehen diverse graphische<br />

Bedienschnittstellen für <strong>CVS</strong> zur Verfügung. Diese basieren<br />

teilweise direkt auf der Kommandozeilen-Schnittstelle, d.h. wenn z.B.<br />

über e<strong>in</strong> Menü e<strong>in</strong>e <strong>CVS</strong>-Operation aufgerufen wird und ggf. über e<strong>in</strong><br />

Formular Parameter erfaßt werden, dann wird aus diesen Angaben<br />

2 Daß diese Kapselung nicht sicher ist und leicht durchbrochen werden kann, soll<br />

uns hier nicht stören.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 6<br />

letztlich e<strong>in</strong>e Kommandozeile konstruiert und die Kommandozeilen-<br />

Schnittstelle wird mit dieser Kommandozeile aufgerufen. Manche graphischen<br />

Bedienschnittstellen zeigen diese Kommandozeile <strong>in</strong> e<strong>in</strong>em<br />

Protokollfeld auch direkt an. Die Historie mehrerer Operationsaufrufe<br />

<strong>in</strong>nerhalb e<strong>in</strong>er Sitzung kann so gut überblickt werden, sofern man die<br />

Kommandos versteht.<br />

Die eigentlich <strong>in</strong>teressante Leistung graphischer Front-ends besteht<br />

eher <strong>in</strong> graphischen Darstellungen von Versionsabhängigkeiten oder<br />

Differenzen zwischen Dateien und ggf. Editierfunktionen zum Zusammenmischen<br />

von Varianten. Diese Funktionen s<strong>in</strong>d bei den e<strong>in</strong>zelnen<br />

graphischen Front-ends recht verschieden ausgeprägt und stehen nicht<br />

im Zentrum des Themas dieses Lehrmoduls; wir werden daher hier nur<br />

die Kommandozeilen-Schnittstelle vorstellen.<br />

2.3 Das Kommando cvs<br />

In UNIX- bzw. L<strong>in</strong>ux-Systemen besteht die gesamte Kommandozeilen-<br />

Schnittstelle aus e<strong>in</strong>em e<strong>in</strong>zigen Programm namens cvs. Der erste<br />

Stellungsparameter dieses Programms gibt die auszuführende <strong>CVS</strong>-<br />

Operation an, z.B. checkout, die weiteren Parameter beziehen sich<br />

dann auf die gewählte Operation. Insgesamt hat der Aufruf folgende<br />

Form:<br />

cvs [cvs-optionen 3 ] cvs-operation [cvs-op-optionen] {Parameter ... }<br />

3 Als Option bezeichnet man i.d.R. Parameter, die e<strong>in</strong>en Namen haben. Stellungsparameter<br />

werden dagegen durch ihre Position <strong>in</strong> der Parameterliste identifiziert.<br />

Man benutzt Optionen bei Parametern, für die normalerweise Vorgabewerte<br />

ausreichen und die nur selten explizit gesetzt werden. In solchen Fällen wären Stellungsparameter<br />

unpraktisch, weil die Parameterlisten extrem lang würden und bei<br />

Aufrufen fast alle Positionen Leerwerte enthielten. Hierzu e<strong>in</strong> Beispiel: Das UNIX-<br />

Kommando ls listet die Namen der Dateien im aktuellen Verzeichnis auf. Mit der<br />

Option -l , also mit dem Aufruf ls -l , wird e<strong>in</strong>e ausführliche Beschreibung jeder<br />

Datei geliefert. Der Wertebereich dieses Parameters ist Boolean, Vorgabewert ist<br />

false . Durch die Angabe von -l wird der Wert auf true gesetzt.<br />

Bei den meisten Optionen ist der Wertebereich Boolean, es s<strong>in</strong>d aber im Pr<strong>in</strong>zip<br />

beliebige Wertebereiche möglich, z.B. Texte oder Zahlen. In solchen Fällen wird der<br />

gewünschte Wert h<strong>in</strong>ter dem Optionsbezeichner als eigenes Wort <strong>in</strong> der Kommandozeile<br />

angegeben. Beim Kommando ls kann z.B. die Breite der Ausgabe mit der<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 7<br />

Beispiele für <strong>CVS</strong>-Operationen s<strong>in</strong>d log<strong>in</strong>, checkout, edit, commit<br />

, add und update; diese werden wir i.f. an Beispielen erläutern.<br />

Der volle Funktionsumfang von <strong>CVS</strong> ist sehr komplex; wir<br />

können hier nur e<strong>in</strong>en Bruchteil davon vorstellen. Vollständige Beschreibungen<br />

f<strong>in</strong>den sich <strong>in</strong> der on-l<strong>in</strong>e-Dokumentation <strong>in</strong> L<strong>in</strong>ux-Systemen<br />

(Kommando: <strong>in</strong>fo cvs) sowie <strong>in</strong> [Ce01]. Ferner werden auf<br />

http://www.cvshome.org/docs weitere Materialien angeboten.<br />

3 Das Repository<br />

3.1 Konzeptioneller Inhalt e<strong>in</strong>es Repositorys<br />

Konzeptionell enthält e<strong>in</strong> <strong>CVS</strong>-Repository e<strong>in</strong>en Dateibaum, die<br />

Blätter dar<strong>in</strong> – i.f. als “Dateien” bezeichnet – s<strong>in</strong>d Dokumente, die<br />

i.a. <strong>in</strong> mehreren Versionen vorhanden s<strong>in</strong>d. Verzeichnisse werden nicht<br />

explizit versioniert.<br />

Dateien haben Namen, wie <strong>in</strong> Dateisystemen üblich. Alle Versionen<br />

e<strong>in</strong>er Datei haben den gleichen Namen; Versionen e<strong>in</strong>er Datei werden<br />

durch e<strong>in</strong>e Versionsnummer unterschieden. Die Versionsnummer ist<br />

nicht Teil des Date<strong>in</strong>amens.<br />

In e<strong>in</strong>em Arbeitsbereich e<strong>in</strong>es Entwicklers liegen Kopien von e<strong>in</strong>em<br />

oder mehreren Teilbäumen des Repositorys. Die <strong>CVS</strong>-Operationen<br />

arbeiten meist mit ganzen Teilbäumen, d.h. man braucht nicht jede<br />

enthaltene Datei e<strong>in</strong>zeln zu behandeln.<br />

Der Arbeitsbereich enthält von jeder Datei i.d.R. nur e<strong>in</strong>e Version,<br />

die den gleichen Date<strong>in</strong>amen wie im Repository hat. Es muß nicht<br />

unbed<strong>in</strong>gt die neuste Version se<strong>in</strong>. Man erkennt also am Date<strong>in</strong>amen<br />

nicht, um welche Version es sich handelt. <strong>CVS</strong> merkt sich <strong>in</strong> bestimmten<br />

Hilfsdaten 4 , welche Version e<strong>in</strong>er Datei im Arbeitsbereich vorliegt.<br />

Option -w angegeben werden. Mit ls -w 40 werden die Ausgaben so formatiert,<br />

daß sie <strong>in</strong> e<strong>in</strong> 40 Zeichen breites Fenster passen.<br />

E<strong>in</strong>e ausführlichere Darstellung f<strong>in</strong>det sich <strong>in</strong> [KSP].<br />

4 Jeder Arbeitsbereich enthält e<strong>in</strong> Verzeichnis namens <strong>CVS</strong> , <strong>in</strong> dem diese Hilfsdaten<br />

gespeichert werden. Dieses Verzeichnis darf nur durch cvs selbst verändert<br />

werden.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 8<br />

Numerierung von Versionen. <strong>CVS</strong> benutzt folgendes Schema zur<br />

Numerierung von Versionen:<br />

Beim Anlegen e<strong>in</strong>er Datei erhält diese als erstes die Nummer 1.1.<br />

Wenn e<strong>in</strong>e neue Revision e<strong>in</strong>er Datei angelegt wird, wird die h<strong>in</strong>terste<br />

Ziffer um 1 hochgezählt. Nach 1.1 kommen also die Versionsnummern<br />

1.2, 1.3, 1.4 usw.<br />

Wenn von e<strong>in</strong>er Datei mit Versionsnummer x.y e<strong>in</strong>e erste Variante<br />

angelegt wird, bekommt diese die Versionsnummer x.y.2.1. Die erste<br />

Variante von Version 1.9 hat also die Nummer 1.9.2.1. Varianten existieren<br />

bekanntlich parallel; wenn von unserer Variante neue Versionen<br />

angelegt werden, gilt das oben Gesagte, d.h. es werden die Nummern<br />

1.9.2.2, 1.9.2.3 usw. vergeben.<br />

Man kann mehrere Varianten zu e<strong>in</strong>er Version anlegen. Die zweite<br />

Variante bekommt als Nummer x.y.4.1, <strong>in</strong> unserem Beispiel also<br />

1.9.4.1, die dritte Variante 1.9.6.1 usw. Die ungeraden Ziffern werden<br />

nicht benutzt, sondern für <strong>in</strong>terne Zwecke verwendet.<br />

Jede Variante kann unabhängig Revisionen bilden, es entstehen<br />

so parallele Entwicklungszweige. Bild 2 zeigt e<strong>in</strong> Beispiel. Die horizontalen<br />

Pfeile zeigen auf Nachfolge-Revisionen, die vertikalen auf<br />

Varianten.<br />

1.8 1.9 1.10 1.11<br />

....<br />

1.9.2.1 1.9.2.2 1.9.2.3 ....<br />

1.9.4.1<br />

1.9.4.2 ....<br />

Abbildung 2: Beispiel e<strong>in</strong>es Versionsgraphen<br />

E<strong>in</strong>e gewisse Ungerechtigkeit liegt dar<strong>in</strong>, daß die Varianten 1.9,<br />

1.9.2.1, 1.9.4.1 usw. zwar im Pr<strong>in</strong>zip alle gleichberechtigt s<strong>in</strong>d, daß aber<br />

die Ursprungsversion, die zuerst existierte, e<strong>in</strong>e um 2 Stellen kürzere<br />

Nummer hat. Daran kann man nichts ändern.<br />

Man kann nach dem gleichen Schema auch noch Untervarianten bilc○2003<br />

Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 9<br />

den, z.B. <strong>in</strong>dem man von Version 1.9.2.2 die erste Variante 1.9.2.2.2.1<br />

bildet.<br />

3.2 Realisierung e<strong>in</strong>es Repositorys<br />

E<strong>in</strong> Repository wird bei <strong>CVS</strong> durch e<strong>in</strong> Verzeichnis realisiert, das diverse<br />

Dateien und Unterverzeichnisse enthält. Diese <strong>in</strong>terne Struktur<br />

<strong>in</strong>teressiert uns jetzt nicht.<br />

In diesem Verzeichnis legt cvs alle Versionen der Dokumente, die<br />

sich unter Versionskontrolle bef<strong>in</strong>den, und alle sonstigen, für <strong>in</strong>terne<br />

Zwecke benötigten Daten ab. Der Inhalt dieses Verzeichnisses sollte<br />

alle<strong>in</strong> durch cvs verändert werden.<br />

Typischerweise unterscheiden sich aufe<strong>in</strong>anderfolgende Revisionen<br />

e<strong>in</strong>es Dokument nur an wenigen Stellen vone<strong>in</strong>ander. So könnte z.B.<br />

<strong>in</strong> e<strong>in</strong>em Text von 100 Zeilen nur e<strong>in</strong>e Zeile geändert oder e<strong>in</strong>gefügt<br />

worden se<strong>in</strong>. <strong>CVS</strong> (genauer gesagt das <strong>in</strong>tern verwendete RCS) nutzt<br />

diesen Sachverhalt <strong>in</strong>tern zu e<strong>in</strong>er Optimierung dah<strong>in</strong>gehend aus, daß<br />

nur die Differenzen der Dateien gespeichert werden und nicht jedesmal<br />

der komplette Text.<br />

3.3 Bezeichnung e<strong>in</strong>es Repositorys<br />

Auf e<strong>in</strong>em Rechner und sogar <strong>in</strong> den Verzeichnissen e<strong>in</strong>es e<strong>in</strong>zelnen<br />

Benutzers können beliebig viele <strong>CVS</strong>-Repositories angelegt werden.<br />

Daher benötigt cvs e<strong>in</strong>e Angabe, mit welchem Repository gearbeitet<br />

werden soll.<br />

E<strong>in</strong> lokales Repository wird angegeben durch den absoluten Pfadnamen<br />

des Repositoryverzeichnisses.<br />

Bei e<strong>in</strong>em entfernten Repository muß der Name des Rechners angegeben<br />

werden, auf dem das Repository gespeichert ist, sowie der<br />

absolute Pfadname des Repositoryverzeichnisses auf diesem entfernten<br />

Rechner. Diese beiden Namen werden mit weiteren Angaben, die<br />

wir anschließend bei der log<strong>in</strong>-Operation erläutern werden, zu e<strong>in</strong>er<br />

e<strong>in</strong>zigen Zeichenkette zusammengefaßt.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 10<br />

3.4 Übergabe der Repositorybezeichnung an cvs<br />

Da man meist nur mit e<strong>in</strong>em bestimmten Repository arbeitet, wäre es<br />

lästig, dieses bei jedem Aufruf angeben zu müssen. Stattdessen kann<br />

das Repository <strong>in</strong> der Umgebungsvariablen 5 <strong>CVS</strong>ROOT übergeben werden.<br />

In der auf UNIX-Systemen verbreiteten c-Shell (csh) oder der<br />

tc-Shell (tcsh) wäre folgendes Kommando e<strong>in</strong>zugeben, um cvs anzuzeigen,<br />

daß mit dem Repository im lokal vorhandenen Verzeichnis<br />

/home/schmitz/pg/archiv gearbeitet werden soll:<br />

setenv <strong>CVS</strong>ROOT /home/schmitz/pg/archiv<br />

In der ba-Shell (bash) ist folgendes e<strong>in</strong>zugeben 6 :<br />

export <strong>CVS</strong>ROOT=/home/schmitz/pg/archiv<br />

Das Repository kann aber auch beim Aufruf von cvs mittels der<br />

Option -d angegeben werden:<br />

cvs -d /home/schmitz/pg/archiv .....<br />

3.5 cvs log<strong>in</strong><br />

Bei e<strong>in</strong>em entfernt zugreifbaren Repository könnten Unberechtigte versuchen,<br />

auf das Repository zuzugreifen. Daher wird der Zugang nur<br />

e<strong>in</strong>zelnen Benutzern erlaubt, die sich durch e<strong>in</strong> Paßwort ausweisen<br />

müssen. Hierzu dient die <strong>CVS</strong>-Operation cvs log<strong>in</strong>; das Paßwort<br />

muß <strong>in</strong>teraktiv e<strong>in</strong>gegeben werden, es wird <strong>in</strong>tern aufbewahrt und anschließend<br />

bei jedem Zugriff benutzt (auch über mehrere Rechnersitzungen<br />

h<strong>in</strong>weg). Mit cvs logout kann das Paßwort wieder gelöscht<br />

werden.<br />

5 Umgebungsvariablen s<strong>in</strong>d e<strong>in</strong>e weitere Technik, mit der <strong>in</strong> UNIX-Betriebssystemen<br />

Parameter von e<strong>in</strong>em Prozeß an e<strong>in</strong>en K<strong>in</strong>d-Prozeß übergeben werden können.<br />

E<strong>in</strong>e Umgebungsvariable hat e<strong>in</strong>en Namen und e<strong>in</strong>en Wert. E<strong>in</strong> Prozeß kann Umgebungsvariablen<br />

erzeugen und ihren Wert setzen. E<strong>in</strong> von diesem Prozeß gestartetes<br />

Programm erbt die Umgebungsvariablen und kann deren Werte dann lesen.<br />

6 Anstatt dieses Kommando bei jeder Sitzung erneut e<strong>in</strong>zugeben ist es bequemer,<br />

es <strong>in</strong> die Datei $HOME/.bashrc bzw. $HOME/.cshrc e<strong>in</strong>zutragen; die Umgebungsvariable<br />

ist dann automatisch <strong>in</strong> jeder Sitzung gesetzt.<br />

Den gleichen Effekt erzielt man bei den meisten graphischen Front-ends, <strong>in</strong>dem<br />

man die Repositorybezeichnung <strong>in</strong> den Vore<strong>in</strong>stellungen e<strong>in</strong>trägt.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 11<br />

Der Benutzername, unter dem man sich e<strong>in</strong>loggen möchte, wird <strong>in</strong><br />

e<strong>in</strong>er erweiterten Form des Repository-Namens angegeben (man kann<br />

geteilter Me<strong>in</strong>ung se<strong>in</strong>, ob das besonders elegant ist). Dies gilt auch<br />

für das Kommunikationsprotokoll, das zur Kommunikation zwischen<br />

<strong>CVS</strong>-Front-end und <strong>CVS</strong>-Server verwendet werden soll. Z.B. bedeutet<br />

der Wert<br />

:pserver:karl@xyz.abc.de:/home/schmitz/pg/archiv<br />

<strong>in</strong> <strong>CVS</strong>ROOT, daß mittels des pserver-Protokolls 7 Verb<strong>in</strong>dung mit dem<br />

Rechner xyz.abc.de aufgenommen werden soll, und zwar für den dort<br />

bekannten Benutzer karl.<br />

4 Anlegen e<strong>in</strong>es Repositorys<br />

Ziel der folgende Abschnitte ist, die wichtigsten <strong>CVS</strong>-Operationen<br />

an Beispielen zu erklären. Die e<strong>in</strong>zelnen dabei benutzten <strong>CVS</strong>-<br />

Operationen werden nicht im Detail erklärt - hierzu sei auf [Ce01] und<br />

die on-l<strong>in</strong>e-Dokumentation verwiesen. Das Ziel ist vielmehr, e<strong>in</strong>en ersten<br />

Überblick zu geben und das Zusammenspiel der <strong>CVS</strong>-Operationen<br />

klarzumachen.<br />

Es ist s<strong>in</strong>nvoll, die gezeigten Beispiele an e<strong>in</strong>em Rechner praktisch<br />

nachzuvollziehen 8 . Hierzu benötigt man e<strong>in</strong> <strong>in</strong>stalliertes Repository.<br />

Erst nachdem e<strong>in</strong> Repository vorhanden ist, können Arbeitsbereiche<br />

e<strong>in</strong>gerichtet werden (mit Hilfe der Operation checkout).<br />

Das E<strong>in</strong>richten e<strong>in</strong>es verteilt zugreifbaren Repositorys ist kompliziert<br />

und ke<strong>in</strong> Lernziel dieses Lehrmoduls. Sofern ke<strong>in</strong> zentrales vorkonfektioniertes<br />

Repository verfügbar ist oder man auf e<strong>in</strong>em nicht<br />

vernetzten Rechner üben will, muß mit e<strong>in</strong>em lokalen Repository gearbeitet<br />

werden. Nachfolgend zeigen wir an e<strong>in</strong>em Beispiel, wie e<strong>in</strong><br />

Repository lokal <strong>in</strong>itialisiert werden kann. Die Kommandos unterstellen<br />

die bash als Kommando<strong>in</strong>terpreter.<br />

7 Es gibt weitere Protokolle, die wir hier aber nicht betrachten.<br />

8 Über die WWW-Seite zu diesem Lehrmodul ist e<strong>in</strong> Shell-Skript erhältlich, das<br />

e<strong>in</strong>e Sequenz von Kommandos mit Erläuterungen durchführt.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 12<br />

1. Erzeugen e<strong>in</strong>es leeren Repositorys. Im Beispiel legen wir das<br />

Repository im home-Verzeichnis unter dem Namen archiv an:<br />

export <strong>CVS</strong>ROOT=$HOME/archiv<br />

cvs <strong>in</strong>it<br />

Die <strong>CVS</strong>-Operation <strong>in</strong>it erzeugt im angegebenen Verzeichnis e<strong>in</strong> leeres<br />

Repository.<br />

2. Anlegen e<strong>in</strong>er <strong>in</strong>itialen Verzeichnisstruktur im Repository.<br />

Angenommen, wir wollen die Programmquelltexte <strong>in</strong> e<strong>in</strong>em Verzeichnis<br />

src speichern, die Dokumentation <strong>in</strong> e<strong>in</strong>em Verzeichnis docs,<br />

dar<strong>in</strong> zwei Unterverzeichnisse docs/handbuch und docs/<strong>in</strong>stall für<br />

das Benutzerhandbuch und die Installationsanweisungen. Wir legen<br />

zunächst an e<strong>in</strong>er beliebigen Stelle im Dateisystem e<strong>in</strong> Hilfsverzeichnis<br />

<strong>in</strong>itdirs an und erzeugen dort die gewünschten Verzeichnisse:<br />

mkdir <strong>in</strong>itdirs<br />

mkdir <strong>in</strong>itdirs/docs<br />

mkdir <strong>in</strong>itdirs/docs/handbuch<br />

mkdir <strong>in</strong>itdirs/docs/<strong>in</strong>stall<br />

mkdir <strong>in</strong>itdirs/src<br />

Diese Struktur können wir nun mit Hilfe der <strong>CVS</strong>-Operation import<br />

<strong>in</strong> das Repository übernehmen. Dies überträgt die Inhalte des Verzeichnisses,<br />

<strong>in</strong> dem sie aufgerufen wird, <strong>in</strong> das Repository. Wir müssen<br />

also zunächst <strong>in</strong> unser Hilfsverzeichnis <strong>in</strong>itdirs h<strong>in</strong>e<strong>in</strong>navigieren:<br />

cd <strong>in</strong>itdirs<br />

cvs import -m "<strong>in</strong>itiale Verzeichnisstruktur erzeugt" \<br />

ws2003/propra x y<br />

Der Schrägstrich am Ende e<strong>in</strong>er Zeile bedeutet, daß das begonnene<br />

Kommando <strong>in</strong> der Folgezeile fortgesetzt wird.<br />

Die Option -m ... (m wie message) erlaubt es, e<strong>in</strong>en Kommentar<br />

zu h<strong>in</strong>terlegen.<br />

Der erste Stellungsparameter ws2003/propra gibt e<strong>in</strong> Unterverzeichnis<br />

<strong>in</strong>nerhalb des Repositorys an, <strong>in</strong> dem die Verzeichnisstruktur<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 13<br />

erzeugt werden soll; sofern noch nicht vorhanden, werden diese Verzeichnisse<br />

im Repository erzeugt. Auf diese Weise ist es möglich, für<br />

mehrere Arbeitsbereiche, die für unterschiedliche parallele Aktivitäten<br />

nötig se<strong>in</strong> mögen, mit e<strong>in</strong>em e<strong>in</strong>zigen Repository auszukommen.<br />

Die beiden folgenden Stellungsparameter (x und y ) dürfen nicht<br />

fehlen, s<strong>in</strong>d aber im Moment un<strong>in</strong>teressant.<br />

Man beachte, daß beim bisherigen Stand der D<strong>in</strong>ge unser Hilfsverzeichnis<br />

<strong>in</strong>itdirs nicht automatisch zu e<strong>in</strong>em Arbeitsbereich geworden<br />

ist. Es wird nicht weiter benötigt und kann gelöscht werden.<br />

5 Anlegen von Arbeitsbereichen<br />

Zu e<strong>in</strong>em Repository können bekanntlich mehrere Arbeitsbereiche<br />

angelegt werden. In unserem Beispiel wollen wir im Verzeichnis<br />

$HOME/arbeit zwei Arbeitsbereiche ab1 und ab2 anlegen. Normalerweise<br />

gehören Arbeitsbereiche zu verschiedenen Entwicklern. Um das<br />

Beispiel e<strong>in</strong>facher nachvollziehbar zu machen, führen wir hier alle Operationen<br />

unter e<strong>in</strong>em e<strong>in</strong>zigen Benutzer aus. Die <strong>CVS</strong>-Operationen<br />

könnten aber ebensogut <strong>in</strong> jedem Arbeitsbereich von e<strong>in</strong>em anderen<br />

Entwickler durchgeführt werden. Wir legen zunächst entsprechende<br />

leere Verzeichnisse an:<br />

mkdir $HOME/arbeit<br />

mkdir $HOME/arbeit/ab1<br />

mkdir $HOME/arbeit/ab2<br />

Anlegen können wir e<strong>in</strong>en Arbeitsbereich mit der <strong>CVS</strong>-Operation<br />

checkout (abgekürzt co ). Als impliziten Parameter hat auch diese<br />

das Verzeichnis, <strong>in</strong> dem sie aufgerufen wird: <strong>in</strong> diesem Verzeichnis<br />

werden die <strong>CVS</strong>-Dateien für e<strong>in</strong>en Arbeitsbereich angelegt oder, sofern<br />

schon vorhanden, korrigiert. Wir müssen also <strong>in</strong> unseren ersten<br />

Arbeitsbereich wechseln:<br />

cd $HOME/arbeit/ab1<br />

cvs checkout -d . ws2003/propra<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 14<br />

Der Parameter ws2003/propra bezeichnet den Teilbaum des Repositorys,<br />

der hierh<strong>in</strong> kopiert werden soll. Ohne die Option -d . würden<br />

die vollen Pfadnamen des Repositorys auch im Dateisystem erzeugt,<br />

also z.B. das Verzeichnis<br />

$HOME/arbeit/ab1/ws2003/propra/docs/handbuch<br />

Die Option -d . bewirkt, daß nur die “lokalen” Pfadnamen von<br />

ws2003/propra aus erzeugt werden. Statt des vorstehenden Verzeichnisses<br />

entsteht somit:<br />

$HOME/arbeit/ab1/docs/handbuch<br />

6 Anlegen von Verzeichnissen und Dateien im<br />

Repository<br />

Anlegen vn Textdateien Angenommen, wir wollen nun im Verzeichnis<br />

docs/handbuch die Datei hb.txt erstellen und unter Versionskontrolle<br />

nehmen. Hierzu benutzt man die <strong>CVS</strong>-Operationen add<br />

und commit. add merkt e<strong>in</strong>e Datei nur zur E<strong>in</strong>tragung <strong>in</strong> das Repository<br />

vor, e<strong>in</strong>getragen wird die Datei erst nach dem commit. Beide<br />

Kommandos müssen im jeweils betroffenen Verzeichnis ausgeführt<br />

werden; wir navigieren also <strong>in</strong> unserem Beispiel zunächst dorth<strong>in</strong>:<br />

cd docs/handbuch<br />

echo ’aller Anfang ist schwer’ > hb.txt<br />

cvs add hb.txt<br />

cvs commit -m ’die erste Zeile’ hb.txt<br />

Beim commit-Kommando kann man i.d.R. auf die Angabe der Datei<br />

verzichten. Ist ke<strong>in</strong>e Datei angegeben, durchsucht <strong>CVS</strong> das aktuelle<br />

Arbeitsverzeichnis und dessen Unterverzeichnisse nach Dateien,<br />

die zur E<strong>in</strong>tragung <strong>in</strong> das Repository vorgemerkt s<strong>in</strong>d, und führt alle<br />

E<strong>in</strong>tragungen durch.<br />

B<strong>in</strong>ärdateien. Unter B<strong>in</strong>ärdateien verstehen wir Dateien, <strong>in</strong> denen<br />

nicht darstellbare Byte<strong>in</strong>halte vorkommen. Beispiele s<strong>in</strong>d die gängigen<br />

Formate für Bilder, Spreadsheets und mit gzip komprimierte Dateien.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 15<br />

Wir hatten bisher unterstellt, daß Datei<strong>in</strong>halte bei e<strong>in</strong>em commit<br />

völlig unverändert <strong>in</strong> das Repository übertragen werden. Dies ist nicht<br />

völlig korrekt, <strong>in</strong> Wirklichkeit werden bestimmte kle<strong>in</strong>ere Veränderungen<br />

vorgenommen. E<strong>in</strong>e der Veränderungen besteht dar<strong>in</strong>, die Zeilenendemarkierungen<br />

<strong>in</strong> den Dateien zu vere<strong>in</strong>heitlichen. Hierzu ist<br />

anzumerken, daß die Zeilenendemarkierungen <strong>in</strong> den unterschiedlichen<br />

Betriebssystemen nicht e<strong>in</strong>heitlich gehandhabt werden. Würde e<strong>in</strong> Repository<br />

von mehreren Rechnern mit verschiedenen Betriebssystemen<br />

aus benutzt, ohne die Zeilenendemarkierungen zu vere<strong>in</strong>heitlichen, so<br />

würden die Algorithmen zur Bildung der Differenzen zwischen Revisionen<br />

<strong>in</strong> jeder Zeile e<strong>in</strong>e Änderungen feststellen und nicht mehr s<strong>in</strong>nvoll<br />

arbeiten.<br />

In B<strong>in</strong>ärdateien können zufällig auch Folgen von Byte<strong>in</strong>halten<br />

auftreten, die identisch mit e<strong>in</strong>er Zeilenendemarkierung s<strong>in</strong>d, aber<br />

natürlich ke<strong>in</strong>e solche darstellen. Diese Byte<strong>in</strong>halte dürfen offensichtlich<br />

nicht gegen e<strong>in</strong>e andere Darstellung e<strong>in</strong>es Zeilenendes ausgetauscht<br />

werden, hierdurch würde der Datei<strong>in</strong>halt unbrauchbar werden. Durch<br />

die Option -kb <strong>in</strong> der <strong>CVS</strong>-Operation add kann erzwungen werden,<br />

daß e<strong>in</strong>e Datei völlig unverändert übernommen wird. Wenn wir beispielsweise<br />

von irgendwoher die Bilddatei logo.gif <strong>in</strong> unseren Arbeitsbereich<br />

kopiert hätten, würden wir dieses Bild wie folgt <strong>in</strong> das<br />

Repository übernehmen:<br />

cvs add -kb logo.gif<br />

cvs commit -m ’neues Bild’ logo.gif<br />

Anlegen von Verzeichnissen. Im Gegensatz zu Dateien werden<br />

(Unter-) Verzeichnisses von add sofort im Repository e<strong>in</strong>getragen.<br />

Nach<br />

mkdir glossar<br />

cvs add -m ’ Verzeichnis glossar erzeugt’ glossar<br />

bef<strong>in</strong>det sich also das Verzeichnis docs/handbuch/glossar sofort im<br />

Repository (und nicht erst nach dem nächsten commit).<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 16<br />

7 Anlegen und Ändern von Dateien <strong>in</strong> e<strong>in</strong>em<br />

Arbeitsbereich<br />

7.1 checkout und commit<br />

Das Neuanlegen von Dateien oder Verzeichnissen im Repository ist<br />

eher die Ausnahme. Meist werden Dateien, die schon im Repository<br />

vorhanden s<strong>in</strong>d, modifiziert. Hierzu werden sie mit der <strong>CVS</strong>-Operation<br />

checkout <strong>in</strong> den Arbeitsbereich kopiert. Nach Beendigung der Änderung<br />

wird die neue Version mit commit wieder <strong>in</strong> das Repository übernommen.<br />

In unserem Beispiel wechseln wir <strong>in</strong> den zweiten Arbeitsbereich und<br />

erzeugen dort e<strong>in</strong>e Kopie des kompletten Teilbaums, den wir eben im<br />

ersten Arbeitsbereich angelegt haben.<br />

cd $HOME/arbeit/ab2<br />

cvs checkout -d . ws2003/propra<br />

Wir f<strong>in</strong>den anschließend <strong>in</strong> $HOME/arbeit/ab2/docs/handbuch unsere<br />

Datei hb.txt. Wir navigieren jetzt <strong>in</strong> dieses Verzeichnis, hängen<br />

e<strong>in</strong>e Zeile an die Datei an und führen danach wieder e<strong>in</strong> commit aus:<br />

cd docs/handbuch<br />

echo ’nun ja’ >> hb.txt<br />

cvs commit -m ’die zweite Zeile’ hb.txt<br />

<strong>CVS</strong> meldet uns dann, daß Revision 1.2 von hb.txt e<strong>in</strong>getragen worden<br />

ist.<br />

Um des Beispiels willen erzeugen wir jetzt noch e<strong>in</strong>e weitere Datei<br />

und tragen sie mit add und commit im Repository e<strong>in</strong>:<br />

echo ’noch e<strong>in</strong> Text’ > nochn.txt<br />

cvs add nochn.txt<br />

cvs commit nochn.txt<br />

“Orig<strong>in</strong>aldateien”. Da wir jetzt mit der Arbeit an hb.txt fertig<br />

s<strong>in</strong>d und der neue Stand im Repository e<strong>in</strong>getragen ist, können wir,<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 17<br />

wenn wir wollen, hb.txt ohne weiteres löschen, denn wir können sie<br />

ja bei Bedarf wieder mit e<strong>in</strong>em checkout restaurieren. In der Praxis<br />

wird man dies i.a. nicht tun, das Beispiel soll vielmehr folgendes<br />

klarmachen: Die übliche Denkweise, wonach man se<strong>in</strong>e “Orig<strong>in</strong>ale” <strong>in</strong><br />

se<strong>in</strong>en Arbeitsverzeichnissen hat und ggf. an anderer Stelle e<strong>in</strong>e Sicherungskopie,<br />

wird bei der Benutzung e<strong>in</strong>es Repositorys sozusagen<br />

umgekehrt: die “Orig<strong>in</strong>ale” bef<strong>in</strong>den sich im Repository, die Arbeitsbereiche<br />

enthalten nur Kopien, die modifiziert se<strong>in</strong> können. Daher<br />

wird e<strong>in</strong>e Datei <strong>in</strong> e<strong>in</strong>em Arbeitsbereich, die e<strong>in</strong>e korrespondierende<br />

Datei im Repository hat, oft als Kopie bezeichnet.<br />

7.2 update<br />

Wir haben nun <strong>in</strong> unseren beiden Arbeitsbereichen Kopien der gleichen<br />

Dateien aus dem Repository vorliegen, wobei im Arbeitsbereich<br />

ab1 e<strong>in</strong>e Datei fehlt und e<strong>in</strong>e e<strong>in</strong>en veralteten Stand hat. Aus Sicht des<br />

Arbeitsbereichs ab1 entspricht dies der Situation, daß jemand anders<br />

die Dokumente <strong>in</strong>zwischen weiterentwickelt hat und daß die Änderungen<br />

lokal nachvollzogen werden müssen. Hierzu ist die <strong>CVS</strong>-Operation<br />

update verfügbar.<br />

Bei e<strong>in</strong>em Aufruf von update können Dateien oder Verzeichnisse<br />

angegeben werden, die auf den neuesten Stand gebracht werden sollen.<br />

Bei Verzeichnissen werden das Verzeichnis und alle direkten und <strong>in</strong>direkten<br />

Unterverzeichnisse durchlaufen und alle gefundenen Dateien<br />

behandelt. Sofern die im Arbeitsbereich bef<strong>in</strong>dliche Kopie identisch<br />

mit der neusten Revision im Repository ist, passiert nichts. Andernfalls<br />

wird e<strong>in</strong>e Korrektur erforderlich, wobei verschiedene Fälle zu unterscheiden<br />

s<strong>in</strong>d. Bezüglich des Zustands der Datei im Arbeitsbereich<br />

s<strong>in</strong>d folgende Fälle von Interesse:<br />

(A) die Datei existiert noch nicht oder nicht mehr im Arbeitsbereich<br />

(B) Die Datei existiert im Arbeitsbereich und entsprach bei ihrem<br />

checkout oder dem letzten update oder commit der Revision<br />

X. Seit diesem Zeitpunkt können sowohl im Arbeitsbereich als<br />

auch im Repository Veränderungen e<strong>in</strong>getreten se<strong>in</strong>. Folgende<br />

Fälle s<strong>in</strong>d denkbar:<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 18<br />

(1) die Datei im Arbeitsbereich ist unverändert.<br />

(2) die Datei im Arbeitsbereich wurde verändert.<br />

(a) Revision X ist die letzte im Repository.<br />

(b) Revision X ist nicht mehr die letzte im Repository.<br />

Insg. ergeben sich 4 Komb<strong>in</strong>ationen B1a, B1b, B2a und B2b.<br />

<strong>CVS</strong> reagiert auf diese Fälle wie <strong>in</strong> der folgenden Tabelle angegeben.<br />

Im Fall (B1a) passiert nichts; <strong>in</strong> den anderen Fällen gibt update e<strong>in</strong>en<br />

Kennbuchstaben und den Date<strong>in</strong>amen aus.<br />

Fall Reaktion Kennbuchstabe<br />

(A) Datei wird neu erzeugt U<br />

(B1a) ke<strong>in</strong>e Änderung -<br />

(B1b) Datei wird auf den gleichen Stand wie das U<br />

Repository gebracht<br />

(B2a) ke<strong>in</strong>e Änderung M<br />

(B2b) automatische Mischung der Änderungen;<br />

hierbei traten ...<br />

... ke<strong>in</strong>e Mischkonflikte auf M<br />

... Mischkonflikte auf C<br />

Darüber h<strong>in</strong>aus existieren u.a. die folgenden Meldungen:<br />

A Die Datei wurde im Arbeitsbereich angelegt, muß aber noch mit<br />

commit gesichert werden.<br />

R Die Datei wurde im Arbeitsbereich gelöscht, die Löschung muß<br />

aber noch mit commit im Repository nachvollzogen werden.<br />

In unserem Beispiel ändern wir zunächst die Datei hb.txt ab<br />

und provozieren so e<strong>in</strong>en Mischkonflikt. Danach veranlassen wir e<strong>in</strong><br />

update für das komplette Verzeichnis docs:<br />

cd $HOME/ab1<br />

echo ’nur Mut!’ >> docs/handbuch/hb.txt<br />

cvs update docs<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 19<br />

update legt die Datei nochn.txt neu an und mischt die Änderungen<br />

<strong>in</strong> hb.txt; hierbei wird e<strong>in</strong>e Warnung ausgegeben – auf solche<br />

Warnungen ist zu achten! – und die ursprünglich im Arbeitsbereich<br />

vorhandene Datei unter e<strong>in</strong>em anderen Namen verwahrt. hb.txt hat<br />

anschließend folgenden Inhalt:<br />

aller Anfang ist schwer<br />

> 1.2<br />

Oberhalb der Zeile ======= steht der bisher im Arbeitsbereich<br />

vorhandene Text, darunter der Text gemäß der letzten Version im Repository.<br />

Option -D. Normalerweise zieht update alle Änderungen nach, die<br />

seit dem Anlegen der Dateien im Arbeitsbereich (bzw. seit dem letzten<br />

Update) im Repository e<strong>in</strong>getragen wurden. Dies geht manchmal zu<br />

weit. So kann an e<strong>in</strong>em bestimmten Datum e<strong>in</strong> konsistenter Zustand<br />

vorhanden gewesen se<strong>in</strong>, seitdem kann aufgrund nicht abgeschlossener<br />

Arbeiten e<strong>in</strong> <strong>in</strong>konsistenter Zwischenzustand im Repository e<strong>in</strong>getragen<br />

se<strong>in</strong>, den nicht jeder sehen möchte. In solchen Fällen kann durch<br />

die Option -D datum bewirkt werden, daß nur die Änderungen bis zu<br />

diesem Datum nachvollzogen werden.<br />

7.3 Statusabfragen<br />

Daß unsere Datei hb.txt Revision 1.2 ist, kann man ihr am Date<strong>in</strong>amen<br />

nicht ansehen. Die Versionsnummer und diverse andere Angaben<br />

zum Zustand von Dateien im Arbeitsbereich kann man mit der <strong>CVS</strong>-<br />

Operation status abfragen. Beispiel:<br />

cvs status hb.txt<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 20<br />

7.4 remove<br />

Es kann natürlich auch der Fall e<strong>in</strong>treten, daß wir e<strong>in</strong>e Datei komplett<br />

löschen wollen. Es reicht jetzt nicht mehr aus, die Datei e<strong>in</strong>fach<br />

im Arbeitsbereich zu löschen, das nächste cvs update würde sie<br />

wiederherstellen. Stattdessen muß sie explizit im Repository gelöscht<br />

werden. Hierzu dient die <strong>CVS</strong>-Operation remove: sie merkt vor, daß<br />

die angegebenen Dateien oder Verzeichnisse beim nächsten commit im<br />

Repository gelöscht werden sollen. Vor dem cvs remove müssen die<br />

Dateien im Arbeitsbereich gelöscht worden se<strong>in</strong>. Hierzu e<strong>in</strong> Beispiel<br />

(wir unterstellen, daß die Datei versuch1.java vorher mit add und<br />

commit im Repository e<strong>in</strong>getragen worden ist):<br />

rm versuch1.java<br />

cvs remove versuch1.java<br />

cvs commit versuch1.java<br />

8 Überwachung paralleler Änderungen<br />

Obwohl <strong>CVS</strong> Sperren nicht direkt unterstützt, bietet es Mechanismen<br />

an, durch die bei entsprechender Diszipl<strong>in</strong> der Entwickler verh<strong>in</strong>dert<br />

werden kann, daß mehrere Entwickler die gleiche Datei editieren.<br />

Die Überwachung paralleler Änderungen kann für e<strong>in</strong>zelne Dateibäume<br />

des Repositorys e<strong>in</strong>- und ausgeschaltet werden. Hierzu dient<br />

die <strong>CVS</strong>-Operation watch<br />

cvs watch on [-l] [-R] dateien ....<br />

Diese <strong>CVS</strong>-Operation schaltet die Überwachung für die angegebenen<br />

Dateien und Verzeichnisse e<strong>in</strong>. Wenn e<strong>in</strong> Verzeichnis angegeben wird,<br />

wird dort überwacht, ob neue Dateien angelegt werden; für die neuen<br />

Dateien wird die Überwachung automatisch e<strong>in</strong>geschaltet. Normalerweise<br />

arbeitet watch rekursiv, wenn also e<strong>in</strong> Verzeichnis angegeben<br />

wird, auch auf allen direkt oder <strong>in</strong>direkt enthaltenen Verzeichnissen<br />

und Dateien. Das rekursive Arbeiten kann durch die Option -l (l wie<br />

lokal) abgeschaltet werden. <strong>CVS</strong> kann aber auch so konfiguriert werc○2003<br />

Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 21<br />

den, daß das lokale Arbeiten vore<strong>in</strong>gestellt ist; <strong>in</strong> diesem Fall bewirkt<br />

die Option -R , daß rekursiv gearbeitet wird.<br />

Abgeschaltet werden kann die Überwachung durch<br />

cvs watch off [-l] [-R] dateien ....<br />

Die Optionen und Parameter werden hier genauso behandelt wie bei<br />

watch on.<br />

Die Überwachung ändert die Wirkung des checkout: während<br />

dieses bisher Dateien im Arbeitsbereich mit Lese- und Schreibrechten<br />

anlegte, werden nun nur noch Leserechte e<strong>in</strong>geräumt.<br />

Wenn e<strong>in</strong> Entwickler nun e<strong>in</strong>e Datei verändern möchte, muß er<br />

vorher e<strong>in</strong>e weitere <strong>CVS</strong>-Operation aufrufen: edit 9 . Beispiel:<br />

cvs edit hb.txt ...<br />

Diese Operation hat folgende Effekte:<br />

– Alle Entwickler, die die angegebene Datei überwachen, werden von<br />

der geplanten Änderung <strong>in</strong>formiert. Das <strong>CVS</strong>-System ist so konfigurierbar,<br />

daß den betroffenen Benutzern e<strong>in</strong>e elektronische Nachricht<br />

geschickt wird (dies ist allerd<strong>in</strong>gs nicht vore<strong>in</strong>gestellt).<br />

– Der Benutzer, der cvs edit aufgerufen hat, wird ab sofort von<br />

Änderungen anderer Entwickler an der Datei <strong>in</strong>formiert.<br />

– Es werden Schreibrechte an den Dateien e<strong>in</strong>geräumt.<br />

Die Datei kann nunmehr verändert werden, und der neue Stand<br />

kann wie üblich mit commit <strong>in</strong> das Repository übertragen werden.<br />

Das commit zeigt das Ende der Bearbeitung an, daher werden als Seiteneffekt<br />

die Schreibrechte wieder entfernt, ferner wird der Entwickler<br />

von Änderungen anderer Entwickler an der Datei nicht mehr benachrichtigt,<br />

Sofern aus irgende<strong>in</strong>em Grund die Bearbeitung der Datei ohne<br />

commit abgebrochen werden muß, ist die <strong>CVS</strong>-Operation unedit zu<br />

benutzen. Diese hat folgende Effekte:<br />

9 Man kann natürlich auch die Rechte direkt im Dateisystem ändern und die<br />

<strong>CVS</strong>-Mechanismen so unterlaufen, d.h. die <strong>CVS</strong>-Mechanismen s<strong>in</strong>d <strong>in</strong> dieser H<strong>in</strong>sicht<br />

nicht sicher.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 22<br />

– Die angegebenen Dateien werden auf den Zustand zurückgesetzt,<br />

den sie beim letzten commit, update bzw. checkout hatten.<br />

– Die Benachrichtigung über Änderungen anderer Entwickler an der<br />

Datei wird aufgehoben.<br />

– Die Schreibrechte an den Dateien werden wieder entzogen.<br />

9 Benutzungsregeln<br />

In den bisherigen Abschnitten wurden die wichtigsten Funktionen von<br />

<strong>CVS</strong> e<strong>in</strong>geführt, wobei offen blieb, wie sie s<strong>in</strong>nvoll und systematisch<br />

e<strong>in</strong>gesetzt werden sollten. Als Abschluß folgen daher e<strong>in</strong>ige Benutzungsregeln:<br />

1. Man sollte so oft wie möglich die Dateien <strong>in</strong> e<strong>in</strong>em privaten Arbeitsbereich<br />

mit update auf den neuesten Stand br<strong>in</strong>gen. Dies gilt<br />

besonders für Dokumente, die bisher noch unverändert s<strong>in</strong>d und<br />

jetzt bearbeitet werden sollen; sie könnten seit dem checkout von<br />

jemand anderem verändert worden se<strong>in</strong>.<br />

2. Es sollten nur compilierfähige Programme bzw. allgeme<strong>in</strong>er gesagt<br />

h<strong>in</strong>reichend konsistente Dokumente <strong>in</strong> das Repository e<strong>in</strong>getragen<br />

werden. Der notwendige Grad an Konsistenz hängt vom Dokumenttyp<br />

und ggf. vom Arbeitsstil e<strong>in</strong>er Gruppe ab. Jedenfalls muß nach<br />

e<strong>in</strong>er E<strong>in</strong>tragung immer damit gerechnet werden, daß e<strong>in</strong> anderes<br />

Gruppenmitglied diese Revision als Basis eigener Arbeiten benutzt.<br />

3. Neue Zustände von Dokumenten sollten möglichst früh <strong>in</strong> das Repository<br />

e<strong>in</strong>getragen werden.<br />

Dies sieht auf den ersten Blick wie e<strong>in</strong> Widerspruch zur vorherigen<br />

Regel aus, ist es aber nicht. Beide Regeln zusammen bedeuten,<br />

daß man umfangreichere Änderungen möglichst <strong>in</strong> e<strong>in</strong>e Folge kle<strong>in</strong>erer<br />

Änderungen aufteilt, die jeweils zu e<strong>in</strong>em konsistenten Zwischenzustand<br />

führen. Dah<strong>in</strong>ter steckt die ganz generelle Lebensweisheit,<br />

nicht parallel an vielen Problemen herumzubasteln, sondern<br />

sich auf wenige D<strong>in</strong>ge zu konzentrieren und diese zügig zum<br />

Abschluß zu br<strong>in</strong>gen.<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 23<br />

4. Arbeitsgruppen, die noch wenig Erfahrung <strong>in</strong> Teamarbeit haben<br />

– hierzu zählen <strong>in</strong>sbesondere Gruppen <strong>in</strong> Programmierpraktika<br />

und studentische Projektgruppen – sollten systematisch edit und<br />

unedit e<strong>in</strong>setzten, um unkontrollierte Parallelarbeit am gleichen<br />

Dokument zu verh<strong>in</strong>dern. Der Mehraufwand zum Aufruf dieser<br />

<strong>CVS</strong>-Operationen ist vergleichsweise ger<strong>in</strong>g, während die Behebung<br />

<strong>in</strong>kompatibler Änderungen viel Zeit kosten und Ärger verursachen<br />

kann.<br />

5. <strong>CVS</strong> macht Planung und Kommunikation <strong>in</strong> der Gruppe nicht überflüssig.<br />

Wenn es häufig dazu kommt, daß verschiedene Entwickler<br />

das gleiche Dokument bearbeiten und vielleicht sogar Mischkonflikte<br />

auftreten, kann e<strong>in</strong>e schlechte Modularisierung des Systems<br />

und e<strong>in</strong>e ungeschickte Arbeitsaufteilung die Ursache se<strong>in</strong>; e<strong>in</strong> KMS<br />

macht solche Planungsfehler nur sichtbar, beheben kann es sie nicht.<br />

Literatur<br />

[Ce01] Cederqvist, Per: Version management with <strong>CVS</strong> (v1.11.1p1);<br />

2001 (<strong>in</strong> verschiedenen Formaten auf http://www.cvshome.-<br />

org/docs/ erhältlich)<br />

[Ti85] Tichy, Walter F.: RCS - a system for version control; Software<br />

- Practice & Experience 15:7, p.637-654; 1985/07<br />

[KM] Kelter, U.: Lehrmodul “<strong>E<strong>in</strong>führung</strong> <strong>in</strong> das Konfigurationsmanagement”;<br />

2003<br />

[KSP] Kelter, U.: Lehrmodul “Kommandosprachen und Shell-Programmierung”;<br />

1988<br />

Glossar<br />

cvs add: <strong>CVS</strong>-Operation zum Anlegen neuer Dateien im Repository<br />

cvs checkout: <strong>CVS</strong>-Operation zum Ausbuchen von Dateien<br />

cvs commit: <strong>CVS</strong>-Operation zum Bestätigen von Änderungen<br />

cvs edit: <strong>CVS</strong>-Operation, mit der man ankündigen kann, daß e<strong>in</strong>e Datei<br />

editiert werden soll<br />

c○2003 Udo Kelter Stand: 09.03.2003


<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>CVS</strong> 24<br />

cvs remove: <strong>CVS</strong>-Operation zum Löschen von Dateien im Repository<br />

cvs status: <strong>CVS</strong>-Operation zur Anzeige des Zustands von Dateien <strong>in</strong> e<strong>in</strong>em<br />

Arbeitsbereich<br />

cvs update: <strong>CVS</strong>-Operation, mit der Dateien, die sich im Arbeitsbereich<br />

bef<strong>in</strong>den, auf den neuesten Stand gemäß Repository gebracht werden<br />

können; e<strong>in</strong>e Variante von update erlaubt es, Varianten von Dateien<br />

zu mischen<br />

cvs watch: <strong>CVS</strong>-Operation, mit der die Überwachung von Dateien und Verzeichnissen<br />

e<strong>in</strong>- und ausgeschaltet werden kann<br />

<strong>CVS</strong>ROOT: Umgebungsvariable, die den Namen des von cvs zu benutzenden<br />

Repositorys enthält<br />

Repository (im Kontext von <strong>CVS</strong>): Synonym zu Versionsarchiv; technisch<br />

gesehen der Name e<strong>in</strong>es Verzeichnisses<br />

c○2003 Udo Kelter Stand: 09.03.2003


Index<br />

Arbeitsbereich, 13<br />

Arbeitsplanung, 23<br />

Archiv, siehe Repository<br />

Benachrichtigung, 20<br />

B<strong>in</strong>ärdateien, 14<br />

Concurrent Versions System, 3<br />

<strong>CVS</strong>, 3<br />

Arbeitsbereich, 11<br />

Benutzungsregeln, 22<br />

Front-end, 3–5<br />

graphisches, 5<br />

Kommandozeilen-Schnittstelle, 5<br />

cvs, 6<br />

add, 14, 16, 23<br />

checkout, 13, 16, 21, 23<br />

co, 13<br />

commit, 14–16, 21, 23<br />

<strong>CVS</strong>ROOT, 10<br />

edit, 21–23<br />

import, 12<br />

<strong>in</strong>it, 11<br />

log<strong>in</strong>, 10<br />

logout, 10<br />

remove, 20, 23<br />

Repositorybezeichnung, 10<br />

status, 19, 24<br />

unedit, 21<br />

update, 17, 19, 22, 24<br />

Kennbuchstaben, 18<br />

watch, 20, 24<br />

<strong>CVS</strong>ROOT, 24<br />

Konfigurationsmanagement<br />

∼system, 3<br />

Kooperation, 22<br />

Kopie, 17<br />

Mischkonflikt, 18, 23<br />

Darstellung, 19<br />

Option, 6<br />

parallele Änderungen, 20<br />

RCS, 3, 9<br />

Repository, 4, 24<br />

Aktualisierung, 17<br />

Anlegen, 11<br />

Anlegen von Dateien, 14<br />

Anlegen von Verzeichnissen, 15<br />

Bezeichnung, 9<br />

entfernter Zugriff, 3, 4, 9<br />

konzeptioneller Inhalt, 7<br />

leeres, 11<br />

Realisierung, 9<br />

Revision, 8, 17<br />

Sperre, 3, 20<br />

Stellungsparameter, 6<br />

Variante, 8<br />

Versionsnummer, 7<br />

Zeilenendemarkierung, 14<br />

Differenzen, 6, 9<br />

KMS, 3<br />

25

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!