Freie Universität Berlin, Fachbereich Mathematik und Informatik
Institut für Informatik, AG Informatik in Bildung und Gesellschaft

Lehrveranstaltung Partizipation im Internet im WS02/03, Thema: CVS

CVS-Beispielablauf

In einer Uni-Lehrveranstaltung unter dem Titel "Programmieren Immerzu (PI)" bekommen die beiden Studenten A und B von Ihrem Dozenten den Auftrag, in zwei Tagen ein HTML-Tutorial über eine Einführung in CVS zu schreiben. Die Vorgehensweise soll nach der Xtreme-Programming-Methode geschehen. A und B finden die Idee zwar theoretisch gut, sind aber scheue Informatik-Studies, und so vereinbaren sie, für ihre Arbeit an der Website CVS zu benutzen, um sich nicht treffen und gemeinsam programmieren zu müssen.

Auf dem Rechner projects.mi.fu-berlin.de ist ein CVS-Server installiert. Ihr Dozent hat dort bereits ein Repository (engl: Lager) eingerichtet, das nach dem Lehrveranstaltungskürzel "pi" genannt wurde. Dies ist die zentrale Speicherposition. Jeder Teilnehmer kann dort Dateien herunterladen ("Check Out" genannt) oder an den Server übertragen ("Check In"). Damit es die beiden CVS-Anfänger leichter haben, gibt es dort auch schon eine Datei aboutcvs.html, die jedoch nichts weiter als das Grundgerüst einer HTML-Datei enthält.

Total motiviert, führen beide einen CheckOut mit cvs durch. Student A stört sich schon lange an grafischen Oberflächen und führt gerne das Kommandozeilen-Tool auf seinem Linux-Rechner aus, nachdem er ein paar Umgebungsvariablen gesetzt hat. Unter seiner bourne-again-shell (bash) gibt er ein:

$ export CVS_RSH=ssh
$ export CVSROOT=:pserver:studenta@projects.mi.fu-berlin.de:/cvsroot/pi 
$ cvs checkout pi

...und die Dateien befinden sich sofort im derzeitigen Arbeitsverzeichnis in einem Unterordner, der pi heißt und neben der Datei aboutcvs.html auch ein Unterverzeichnis CVS enthält. Die Datei aboutcvs.html sieht zur Zeit noch so aus:

<html>
  <head>
  </head>
  <body>
  </body>
</html>

Auch B ist ganz angetan, dass es wie WinCVS für Windows auch grafische Clients unter Linux gibt. Er ruft Cervisia auf und führt einen CheckOut durch. Ganz begeistert will er das ganze auch unter seinem Windows auf der anderen Partition ausprobieren, als er aber Windows hochgefahren hat, spielt er doch erst noch ein Computerspiel.

A fängt sofort an, HTML zu programmieren. Er schreibt eine allgemeine Einleitung über die Geschichte von CVS:

      .
      .
      .
  <body>

<h1>Über CVS</h1>

<h2>Geschichte</h2>

<p>CVS ist die häufigst verwendete Software zur Verwaltung offener
Quelltexte. 
Es entstand nicht nach der Vision eines einzelnen, sondern war 1986
nur eine Sammlung von Scripten zur Verbesserung von diff und RCS. 
1990 wurde CVS netzwerkfähig.</p>

  </body>
</html>

A speichert die Datei aboutcvs.html ab und führt zur Kontrolle seinen ersten CheckIn (oder auch Commit) aus, natürlich mit einer Message, die kurz wiedergibt, was er gemacht hat:

$ cvs ci -m "Geschichte geschrieben" pi
/cvsroot/pi/aboutcvs <-- pi/aboutcvs.html
new revision: 1.2, previous revision: 1.1.1.1
$ 

B Hat die ganze Zeit Computer gespielt. Er ist stark soziologisch veranlagt und sagt sich, genug isoliert am Computer gesessen zu haben, und geht in die Kneipe.

A ist völlig begeistert von CVS und schreibt den nächsten Abschnitt über den Grundaufbau des CVS-Kommandos.

      .
      .
      .
<h2>cvs-Kommando</h2>
<p>Das cvs-Programm kennt sowohl Server- als auch Client-Funktionen.
Der Befehl besteht aus</p>
<ul>
<li>dem Befehl cvs</li>
<li>allgemeinen Optionen</li>
<li>dem Kommando (wie checkin oder checkout)</li>
<li>und Kommando-Optionen</li>
</ul>

  </body>
</html>

A führt ein Update aus, bemerkt aber an der Ausgabe, dass sich nichts verändert hat. Erneut macht er einen Checkin seiner Datei aboutcvs.html. B wird müde und geht Heim ins Bett. A arbeitet die Nacht durch und schreibt etwas über die CVS-Ausgabe:

      .
      .
      .
<h2>CVS-Meldungen</h2>

<p>Vor jeder behandelten Datei steht ein Buchstabe:</p>
<dl>
<dt>N</dt><dd>Die Datei ist neu angelegt worden 
(mit import oder add)</dd> 
<dt>U</dt><dd>Die Datei ist 
(mit update oder checkout) geupdatet worden.
<dt>M</dt><dd>Zwei Versionen der Inhalte einer Datei 
sind (mit update oder checkout) zusammengefügt (merged) worden</dd>
</dl>

  </body>
</html>

A ist fertig und macht wieder einen Checkin. Er hat zwar alles alleine gemacht, freut sich aber, viel gelernt zu haben.

Am nächsten Tag sieht sich B seine eigene, noch unveränderte Datei an, hat aber keine Lust, sich mit dem CVS-Referat zu beschäftigen. Er fügt im Kopf der HTML-Datei ein Stylesheet hinzu:

<html>
  <head>
    <link rel="stylesheet" type="text/css" src="/styles/ag-bg.css">
  </head>
  <body>
  </body>
</html>

Er führt einen Checkin durch, kommt aber ins schwitzen, weil CVS eine unerwartete Ausgabe liefert und sich offenbar weigert, die Datei anzunehmen. Die Zeile "checkout first." gibt ihm aber doch den richtigen Anhaltspunkt.

Er führt also zunächst einen Checkout (oder Update) durch, weil Änderungen immer bei einem Client ausgeführt werden, damit auch Konfliktfälle aufgefangen werden können, und erhält die Ausgabe:

$ cvs co pi
cvs update: Updating pi
M pi/aboutcvs.html
$

Offenbar gab es keinen Konflikt, da beide Studenten unterschiedliche Teile (Zeilen) der Datei bearbeitet haben. Nun kann er alles einchecken und ist fertig.

$ cvs ci -m "Generelle Ueberarbeitung, totales Neudesign" pi
/cvsroot/pi/aboutcvs <-- pi/aboutcvs.html
new revision: 1.4, previous revision: 1.3
$ 

Offenbar hat alles funktioniert. Zufrieden fährt er in die Uni.

Der Dozent ist begeistert von der Arbeit der Studenten und gibt beiden eine 1. Der erfahrene Komilitone C gibt etwas an seinem Rechner ein und macht im nachhinein verblüffende Anmerkungen:

  1. Ein Checkin sollte nicht immerzu als Sicherungskopie verwendet werden, sondern erst nach einem abgeschlossenen Stück Arbeit erfolgen.
  2. Der Code im Repository sollte immer funktionsfähig sein.
  3. Mit Blick auf B: Zur Arbeit gehört mehr als das Schreiben eines Stylesheets am letzten Tag!

Mit welchem Kommando kann C die Informationen über die beiden herausgefunden haben? Studiere geeignete CVS-Literatur und finde heraus, wie man mit CVS Informationen über die Historie bekommt! Wenn Du auf interessante Quellen zur Lösung stößt, dann unterrichte auch die anderen darüber, was geeignete Hilfsdokumente sind!