Überblick

Dieser Text ist eine kleine Einführung in das Versionsmanagement-System CVS. Er hilft dabei, einen Überblick über die Möglichkeiten von CVS zu bekommen und zeigt die ersten und wichtigsten Schritte zur Bedienung auf. Wer tiefer einsteigen oder die besonderen Funktionen von CVS verwenden will, der kann sich im letzten Abschnitt Hinweise zu weiteren Informationen einholen.

 

  1. Was ist CVS?
  2. Konzepte
    1. Revisionen
    2. Tags - Symbolische Revisionen
    3. Verzweigen und Zusammenführen
    4. Mehrere Entwickler
    5. Binäre Dateien
  3. CVS in der Kommandozeile
    1. Eine lokale Kopie erzeugen
    2. Eine Sitzung starten/beenden
    3. Dateien hinzufügen
    4. Dateien entfernen
    5. Dateien aktualisieren
    6. Dateiunterschiede anzeigen
  4. WinCVS - Eine grafische Benutzeroberfläche für CVS
    1. Einstellungen
    2. Eine Sitzung starten/beenden
    3. Eine lokale Kopie erzeugen
    4. Benutzung
  5. Weitere Informations-Quellen

-- Einige Texte stammen aus der englischen Anleitung zu CVS.

1. Was ist CVS?

CVS ist ein Versionskontrollsystem. Mit seiner Hilfe kann man alle Entwicklungsschritte seiner Quellcode-Dateien aufzeichnen.

Beispielsweise schleichen sich manchmal Fehler ein, wenn Änderungen an der Software vorgenommen werden, und man entdeckt diese erst viel später nach der Änderung. Mit CVS kann man ganz einfach alte Versionen zurückholen, um herauszufinden, welche Änderung einen bestimmten Fehler verursacht hat.

Natürlich könnte man auch jede einzelne Version seiner Dateien wegsichern. Allerdings würde das enorm viel Speicherplatz verbrauchen und eine gewisse Organisation der Daten erfordern. CVS dagegen speichert alle Versionen einer Datei in einer einzigen Datei ab und zwar so, daß jeweils nur die Unterschiede zwischen zwei Versionen gesichert werden.

CVS ist außerdem nützlich, wenn mehrere Leute an einem Projekt arbeiten. Dabei passiert es nur allzu häufig, daß jemand die Änderungen eines anderen aus Versehen überschreibt (wenn man nicht außerordentlich vorsichtig ist). Es gibt zwar einige Editoren, die eine Datei schützen, solange sie in Bearbeitung ist, jedoch müßten dann alle denselben Editor benutzen. CVS löst dieses Problem, indem es jeden Entwickler isoliert und ihm sein eigenes Arbeitsverzeichnis gibt. Anschließend werden die einzelnen Änderungen dann wieder zusammengebracht.

Abb. 1.1
Abb. 1.1
Jeder Benutzer erhält seine eigene Kopie der Dateien aus dem Depot

2. Konzepte

2.1 Revisionen

Jede Version einer Datei bekommt eine bestimmte Revisionsnummer, z.B. 1.1, 1.2, 1.3.2.2 oder gar 1.3.2.2.4.5. Eine Revisionsnummer besteht dabei immer aus einer geraden Anzahl von Nummern. Die allererste Version einer Datei bekommt normalerweise die Nummer 1.1. Bei jeder weiteren Version wird einfach die Zahl, die am weitesten rechts steht, um eins erhöht. Die folgende Grafik zeigt ein paar Revisionen, wobei die neueste ganz rechts steht.

Abb. 2.1
Abb. 2.1
Mehrere Revisionen einer Datei

Revisionsnummern können auch mehr als einen Punkt enthalten, wie z.B. in 1.3.2.2. In diesem Fall handelt es sich um eine Revision auf einer bestimmten Verzweigung (siehe 2.3).

Anmerkung: Ein Software-Produkt kann ebenfalls eine Versionsnummer haben, z.B. Version 4.1.1. Dies darf man allerdings nicht verwechseln mit den Versionen einer einzelnen Datei, Revisionen genannt. Dagegen heißt die Version eines Software-Produkts Release.

2.2 Tags - Symbolische Revisionen

Die Revisionsnummern der Dateien haben ihre eigene Bedeutung und haben in der Regel nichts mit der Releasenummer des Software-Produkts zu tun. Je nach dem, wie man CVS verwendet, kann sich die Revisionsnummer einer Datei mehrmals zwischen zwei Releases ändern.

Mit Hilfe von Tags kann man Datei-Revisionen einen symbolischen Namen geben, was das Auffinden einer bestimmten Revision zu einem späteren Zeitpunkt vereinfacht. Normal überlegt man sich, wie die Tags aussehen und verwendet dann immer das gleiche Muster, z.B. GRAUWAL-0_1 für den Release Grauwal 0.1.

Es gibt selten einen Grund, nur einer einzelnen Datei ein Tag zu geben. Meistens bekommen alle Dateien, die zu einem Modul gehören oder die sonst irgendeine Gemeinsamkeit haben, dasselbe Tag. Damit kann man z.B. den Zeitpunkt eines Software-Releases markieren. Egal welche Revisionnummer jede Datei hat, sie bekommt denselben symbolischen Namen.

Abb. 2.2
Abb. 2.2
Ein Tag bei mehreren Dateien

Damit kann man zu einem späteren Zeitpunkt alle Dateien in demselben Zustand aus dem Repository holen und muß sich nicht die Revisionsnummer jeder einzelnen Datei merken.

2.3 Verzweigen und Zusammenführen

CVS erlaubt es, Änderungen auf nur eine Entwicklungslinie zu beschränken, eine sogenannte Verzweigung (branch). Wenn man Dateien in einer Verzweigung ändert, werden diese Änderungen nicht im Hauptabschnitt (main trunk) oder in anderen Verzweigungen sichtbar. Später kann man dann eine Verzweigung mit einer anderen (oder dem Hauptabschnitt) zusammenführen (merge).

Abb. 2.3
Abb. 2.3
Ein Beispiel für mehrfache Verzweigungen

Wann macht es nun Sinn, Verzweigungen zu verwenden? Angenommen man hat Version 1.0 seiner Anwendung herausgebracht. Die Entwicklung steht inzwischen nicht still, sondern geht weiter voran, damit man in ein paar Monaten Version 1.1 veröffentlichen kann. Nach einiger Zeit beschweren sich einige Kunden über einen fatalen Fehler. Also holt man sich alle Dateien von Version 1.0 aus dem Repository, sucht den Fehler und behebt ihn. Doch die aktuellen Revisionen der Quelldateien werden ständig verändert und werden wohl vor einem weiteren Monat nicht stabil sein. Es besteht keine Möglichkeit, einen Bugfix zu veröffentlichen, der auf den aktuellen Quelldateien beruht.

Der Ausweg besteht darin, eine Verzweigung für alle Dateien aus Version 1.0 zu erstellen. Nun kann man Veränderungen vornehmen, ohne den Hauptabschnitt zu beeinflussen. Wenn alle Änderungen abgeschlossen sind, kann man sich entscheiden, sie in den Hauptabschnitt zu übernehmen oder nicht.

2.4 Mehrere Entwickler

Wenn mehr als eine Person an einem Software-Projekt arbeitet, wird es oft etwas komplizierter. Häufig versuchen zwei Personen zur selben Zeit, die gleiche Datei zu bearbeiten. Eine Möglichkeit besteht nun darin, diese Datei zu sperren, sodaß nur eine Person damit arbeiten kann. Allerdings bleibt dann der anderen Person nichts anderes übrig, als zu warten, bis die Datei wieder freigegeben ist.

CVS verfährt dagegen standardmäßig anders: jeder Entwickler erhält seine eigene Arbeitskopie der Datei und kann diese nach Belieben verändern. Der erste, der seine Datei wieder zurückschreibt, merkt noch nichts von den anderen. Alle anderen Entwickler erhalten dann eine Fehlernachricht, bei dem Versuch, ihre Version zurückzuschreiben. Sie müssen dann zuerst die erneuerte Version aus dem Repository holen. Diese wird dabei automatisch mit der lokalen Version zusammengeführt. Der Entwickler muß das Resultat dann nochmal überprüfen und kann es dann schließlich ins Depot zurückstellen.

2.5 Binäre Dateien

Normalerweise wird CVS verwendet, um Textdateien zu speichern. Diese haben den Vorteil, daß man z.B. Revisionen zusammenführen und sich Unterschiede zwischen zwei Revisionen anzeigen lassen kann. Verzichtet man auf diese Vorteile, kann man auch binäre Dateien speichern, wie z.B. Bilder. Das ist dann sinnvoll, wenn man sein ganzes Projekt mit CVS verwalten will, beispielsweise eine Website, die neben den reinen Texten (die HTML-Seiten) noch Bilder und vielleicht ein paar Dateien zum Herunterladen enthält.

3. CVS in der Kommandozeile

3.1 Eine lokale Kopie erzeugen

Dieses Beispiel zeigt wie man eine neue Sitzung startet und eine lokale Kopie der Dateien aus dem Repository anlegt.
In den folgenden Zeilen steht das Dollar-Zeichen ($) für die Eingabeaufforderung und GRUPPENNAME für den Name der eigenen Gruppe.

  1. Secure Shell starten (z.B. TeraTerm SSH) und mit einem Rechner im WS-Pool verbinden (z.B. ws01.informatik.uni-ulm.de). Login-Name und Kennwort sind dieselben wie im PC-Pool.
  2. $ export CVSROOT=:pserver:GRUPPENNAME@pandora.informatik.uni-ulm.de:/home/cvs/sopra
    Den Ort des Repositories bekanntgeben.
  3. $ cvs login
    Sich im Repository einloggen. Das Programm fragt nur nach einem Kennwort, das für die gesamte Gruppe gilt.
  4. $ cd ~
    In das gewünschte Verzeichnis wechseln, in dem die lokale Kopie angelegt werden soll.
  5. $ cvs checkout GRUPPENNAME
    Dieser Befehl legt eine lokale Kopie aller Dateien aus dem Repository an.
  6. $ cd GRUPPENNAME

3.2 Eine Sitzung starten/beenden

Wie man eine neue Sitzung startet wurde im Prinzip schon oben gezeigt. Hier nochmal die notwendigen Schritte im einzelnen.

  1. Secure Shell starten (z.B. TeraTerm SSH) und mit einem Rechner im WS-Pool verbinden (z.B. ws01.informatik.uni-ulm.de). Login-Name und Kennwort sind dieselben wie im PC-Pool.
  2. $ export CVSROOT=:pserver:GRUPPENNAME@pandora.informatik.uni-ulm.de:/home/cvs/sopra
    Den Ort des Repositories bekanntgeben.
  3. $ cvs login
    Sich im Repository einloggen. Das Programm fragt nur nach einem Kennwort, das für die gesamte Gruppe gilt.
  4. $ cd ~/GRUPPENNAME
    In das gewünschte Verzeichnis wechseln, in dem man seine lokale Kopie angelegt hat.

Das Beenden einer Sitzung ist noch einfacher:

  1. $ cvs logout
    Sich aus dem Repository ausloggen.
  2. $ exit
    Kommandozeile wieder verlassen.

3.3 Dateien hinzufügen

In diesem Beispiel wird eine Datei beispiel.txt in das Repository eingefügt. Es wird davon ausgegangen, daß bereits eine Sitzung gestartet wurde.

  1. Eine neue Datei anlegen (hier beispiel.txt) und eventuell bearbeiten.
  2. $ cvs add beispiel.txt
    Datei zum Einfügen markieren.
  3. $ cvs commit -m "Erster Eintrag." beispiel.txt
    Datei ins Depot aufnehmen.
    Anmerkung: Bei jedem "cvs commit" gibt man mit Hilfe der Option "-m" einen Kommentar mit, damit die anderen Entwickler nachsehen können, was geändert wurde bzw. was neu ist.

3.4 Dateien entfernen

In diesem Beispiel wird die Datei beispiel.txt wieder aus dem Depot entfernt. Es wird davon ausgegangen, daß bereits eine Sitzung gestartet wurde.

  1. $ rm beispiel.txt
    Datei aus dem aktuellen Verzeichnis löschen.
  2. $ cvs remove beispiel.txt
    Dem Repository mitteilen, daß man die Datei löschen will.
  3. $ cvs commit -m "Wurde gar nicht gebraucht." beispiel.txt

Es kann vorkommen, daß man aus Versehen eine Datei gelöscht hat, sie aber wieder braucht. Dann kann man sie wieder aus dem Depot zurückholen, allerdings nur, solange noch kein "cvs remove" und kein "cvs commit" ausgeführt wurde:

  1. $ rm beispiel.txt
    Ups, Datei aus Versehen gelöscht.
     
  2. $ cvs update beispiel.txt
    Datei wiederherstellen.

Alternativ, wenn bereits ein "cvs remove" ausgeführt wurde:

  1. $ rm beispiel.txt
  2. $ cvs remove beispiel.txt
     
  3. $ cvs add beispiel.txt
    Datei wiederherstellen.

3.5 Dateien aktualisieren

Dieses Beispiel zeigt, wie man seine lokalen Dateien auf den (neuesten) Stand des Repositories bringen kann. Es wird davon ausgegangen, daß bereits eine Sitzung gestartet wurde.

  1. $ cvs update beispiel.txt
    Bringt die Datei beispiel.txt auf den neuesten Stand.

Man kann auch ein komplettes Verzeichnis mit allen Dateien und Unterverzeichnissen aktualisieren:

  1. $ cvs update .
    Das aktuelle Verzeichnis und alles darunter aktualisieren.

Anmerkung: Es kann passieren, daß sowohl die lokale Datei als auch die Version im Repository geändert wurden. Dann fügt der update-Befehl beide Versionen zusammen und gibt einen Hinweis aus (die alte Datei wird als Backup kopiert). Man muß dann nochmal selbst die zusammengefügte Datei ansehen, eventuell korrigieren und wieder ins Depot zurückstellen.

3.6 Dateiunterschiede anzeigen

Will man sich die Unterschiede zwischen seiner aktuellen Version und einer Version im Repository anzeigen, verwendet man folgenden Befehl:

  1. $ cvs diff beispiel.txt
    Vergleicht beispiel.txt mit derselben Revision im Depot.

4. WinCVS - Eine grafische Benutzeroberfläche für CVS

Dieser Abschnitt schildert die ersten Schritte bei der Benutzung von WinCVS. Auf alle fortgeschrittenen Funktionen wird hier verzichtet.

4.1 Einstellungen

Wenn man WinCVS das erste Mal startet, ist das wichtigste, alle Einstellungen entsprechend zu setzen. Dazu geht man folgendermaßen vor:

  1. WinCVS starten, falls es noch nicht offen ist.
  2. Menüpunkt Cvs Admin -> Preferences...
  3. Bei Enter the CVSROOT gibt man folgendes ein:
    GRUPPENNAME@pandora.informatik.uni-ulm.de:/home/cvs/sopra,
    wobei GRUPPENNAME wieder für den Name der Gruppe steht.
  4. Authentication ändert man auf "passwd" file on the cvs server.
Abb. 4.1
Abb. 4.1
Allgemeine Einstellungen
  1. Den Karteireiter Globals anklicken.
  2. Die Einstellung Prune (remove) empty directories abwählen. Das ist notwendig, weil das Repository anfangs nur ein leeres Verzeichnis mit dem Gruppennamen enthält, das sonst beim Checkout sofort wieder gelöscht würde.
Abb. 4.2
Abb. 4.2
Globale Einstellungen
  1. Den Karteireiter WinCvs anklicken.
  2. Bei HOME folder mittels Change folder: sein Heimatverzeichnis auswählen.
  3. Den Dialog wieder mit OK schließen. Damit ist man mit den Einstellungen fertig.

4.2 Eine Sitzung starten/beenden

Bevor man sein Repository nun verwenden kann, muß man sich noch einloggen. Das geschieht mit Cvs Admin -> Login.... Man muß hier das Kennwort seiner Gruppe angeben.

Am Ende einer Sitzung loggt man sich mit Cvs Admin -> Logout wieder aus.

4.3 Eine lokale Kopie erzeugen

Greift man das erste Mal auf sein Repository zu, erzeugt man zuerst eine lokale Kopie aller Dateien, damit man anschließend damit arbeiten kann. Dazu sind folgende Schritte notwendig:

  1. Menüpunkt Cvs Admin -> Checkout module...
  2. Im folgenden Dialog wählt man das Verzeichnis aus, in dem die lokale Kopie erstellt werden soll.
    Achtung: Dieser Befehl erstellt ein weiteres Unterverzeichnis mit dem Namen der Gruppe. Heißt meine Gruppe beispielsweise Tesafilm und gebe ich den Pfad h:\sopra an, so wird das Verzeichnis h:\sopra\tesafilm erstellt.
  3. Im Karteireiter Checkout settings gibt man jetzt den Namen des Moduls an, d.h. in unserem Fall den Namen der Gruppe (alles in Kleinbuchstaben).
  4. Das war's auch schon. Mit OK wird nun die lokale Kopie erzeugt.
Abb. 4.3
Abb. 4.3
Checkout Einstellungen

4.4 Benutzung

WinCVS ist ziemlich einfach zu bedienen. Man führt die meisten Funktionen über das Kontextmenü aus. Einfach über einer Datei oder einem Ordner die rechte Maustaste drücken. Hat man einen Ordner ausgewählt, wird eine Aktion auf dessen gesamten Inhalt angewendet, d.h. auf alle Dateien und alle weiteren Unterverzeichnisse.

Abb. 4.4
Abb. 4.4
Das Kontextmenü

Ganz nützlich ist vielleicht die Schaltfläche Change location Change location. Damit kann man das Verzeichnis einstellen, das in dem Baum auf der linken Seite angezeigt wird.

5. Weitere Informationsquellen

Im Web finden sich zahlreiche weitere Dokumente zum Thema CVS. Hier sind noch ein paar Links aufgeführt: