Einführung in CVS - Praktische Informatik
Einführung in CVS - Praktische Informatik
Einführung in CVS - Praktische Informatik
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