Teil von SELFHTML aktuell Teil von Artikel Teil von Projektverwaltung

Versionskontrolle von Webseiten am Beispiel CVS

nach unten Franz Prilmeier
nach unten Wozu brauche ich Versionskontrolle?
nach unten CVS - ein freies Versionskontrollsystem
nach unten CVS im Internet
nach unten Benutzeroberflächen für CVS
nach unten Weitere Informationen zu CVS
nach unten Andere Versionskontrollsysteme

Franz Prilmeier

E-Mail: E-Mail prilmeie@in.tum.de
Homepage-URL: deutschsprachige Seite http://home.in.tum.de/prilmeie/

Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!

nach obennach unten

Wozu brauche ich Versionskontrolle?

Jedes ernsthafte Projekt bedarf Regelungen zur Verwaltung von Quelltexten und zur Qualitätssicherung. Das gilt nicht nur für Softwareprojekte, sondern auch für Web-Projekte. Versionskontrollsysteme liefern einem genau die richtigen Werkzeuge für diese Aufgaben. Sie ermöglichen den Zugriff auf die aktuelle oder auch auf frühere Versionen der Quelltexte. Man könnte natürlich alle früheren Versionen einfach sichern, ein Versionskontrollsystem ist jedoch bei der Speicherung in jedem Falle effizienter.

Bei Projekten die von mehreren Mitarbeitern bearbeitet werden, bieten Versionskontrollsysteme meist die einzige sinnvolle Möglichkeit das Projekt bei räumlicher Verteilung der Mitarbeiter sinnvoll zu organisieren. Bearbeiten z.B. zwei Mitarbeiter eine Datei gleichzeitig, dann verliert derjenige seine Arbeit, der die Datei zuerst zurückschreibt. Die Aufgabe eines Versionskontrollsystems ist es genau dieser Situation entgegenzuwirken; Jeder Mitarbeiter erhält dazu seine eigene Arbeitskopie. Falls er seine Arbeit beendet hat, dann signalisiert er dies dem Versionskontrollsystem. Dieses nimmt dann die Änderungen auf und trägt diese anschliessend in den bereits vorhandenen Dateien ein. Würde dabei die Arbeit eines anderen Mitarbeiters überschrieben werden, so wird das Versionskontrollsystem entsprechende Maßnahmen einleiten.

Zusammenfassend kann man sagen, Versionskontrolle wird immer dann benötigt, wenn

nach obennach unten

CVS - ein freies Versionskontrollsystem

Das bekannteste der freien Versionskontrollsysteme ist das Concurrent Version System (CVS). Im Folgenden lernen wir kurz die Grundfunktionen kennen, mehr Auskünfte gibt aber auf jeden Fall das offizielle englischsprachige Seite Manual von CVS. CVS ist für verschiedene Plattformen erhältlich, unter anderem für MS-Windows, Linux und den meisten Unix Derivaten, inklusive dem Quellcode. Eine Übersicht der erhältlichen Platformen kann man sich bei der bei der englischsprachige Seite Downloadseite von CVS verschaffen.

CVS speichert alle Dateien an einem zentralen Platz, dem sogenannten Repository. Der erste Schritt ist also so ein Repository einzurichten. Davor muss man sich allerdings zuerst über die Lage des Wurzelverzeichnis des Repository, dem sogenannten CVSROOT, klar werden. Hat man ein derartiges Verzeichnis festgelegt, dann kann man das Repository anlegen. Dazu öffnet man eine Eingabeauforderung (bzw. Shell) und gibt folgenden Befehl ein:

cvs -d CVSROOT init

An sich müsste man für jeden cvs Befehl immer -d CVSROOT angeben. Dies kann man vermeiden, falls man eine Umgebungsvariable CVSROOT setzt. In einer MS-Windows Eingabeaufforderung setzt man Umgebungsvariablen entweder in der Datei autoexec.bat (Dazu ist aber ein Neustart erforderlich) oder in der Eingabeaufforderung mit dem Befehl set CVSROOT=<CVSROOT>, wobei für <CVSROOT> das gewählte Verzeichnis einzusetzen ist. Für andere Betriebssysteme gibt es ähnliche Vorgehensweisen. Ist einmal die Variable CVSROOT gesetzt, dann kann man sich die zusätzliche Angabe dazu sparen.

Da nun das Repository eingerichtet ist, können wir das erste Projekt importieren. Nennen wir das Projekt der Einfachheit halber einfach "Projekt". Dann kann man das leere Projekt "Projekt" wie folgt in CVS importieren:

Eingabe Bedeutung
mkdir Project Das Verzeichnis "Projekt" anlegen.
cd Projekt Ins Verzeichnis "Projekt" wechseln.
cvs import -m "Nachricht" Projekt Firmenname Ausgabezusatz Das Projekt importieren.

Der letzte Befehl bedarf etwas Erläuterung. Der Befehl import dürfte klar sein, damit zeigen wir dem System an, dass wir etwas importieren wollen. An der nächsten Stelle kommt mit der Angabe -m "Nachricht" ein sehr wichtiges Merkmal, denn man kann bei jeder Änderung dem System mitteilen, was man geändert hat. Damit können Entwickler sich z.B. untereinander mitteilen, was sie gerade geändert haben. Diese Aufgabe kann ein Versionskontrollsystem den Entwicklern nicht abnehmen, es zwingt jedoch Entwickler diese Angaben zu machen, denn ohne Nachricht wird das System den Befehl nicht akzeptieren. Mit Projekt gibt man dem System bekannt, unter welchen Namen das Projekt abgespeichert werden soll. Basierend auf dieser Angabe erzeugt das System intern eine Verzeichisstruktur, die beim Austragen (checkout) wieder nachgebildet wird. Im Beispiel oben wurde als Projektname "Projekt" angegeben. Es dürfte klar sein, dass der Name eines Projektes im System eindeutig sein muss, d.h. es darf kein weiteres Projekt mit demselben Namen geben. Die Angaben über Firmennamen und Ausgabezusatz haben in diesem Zusammenhang keine Bedeutung, CVS verlangt aber die Angabe dieser beiden Atribute. Sie sind vor allem im Zusammenhang mit Programmen und Arbeiten Dritter von Bedeutung.

Nachdem wir nun also unser erstes Projekt importiert haben, wollen wir es auch gleich wieder austragen, um daran arbeiten zu können:

cvs checkout Projekt

Nun müsste ein Verzeichnis "Projekt" entstanden sein. Interessant ist, dass sich in diesem Verzeichnis ein Unterverzeichnis CVS befindet. In diesem Verzeichnis sind Informationen zu dem aktuellen Verzeichnis gespeichert. Diese Informationen sind für das CVS System wichtig und sollten nicht besonders stören. Jetzt können wir mit der Arbeit beginnen. Zuerst erstellen wir eine Webseite, nennen wir sie index.html und ein passendes Bild, nennen wir es title.gif. Anschliessend teilen wir dem System mit, dass wir die beiden Dateien zum Projekt hinzufügen möchten:

Eingabe Bedeutung
cvs add -m "Das ist meine erste Webseite" index.html Die Datei index.html hinzufügen. Da wir uns ja bereits im Verzeichnis "Projekt" befinden, ist eine Angabe des Verzeichnisses nicht notwendig.
cvs add -kb -m "Das passende Bild dazu" title.gif Die Datei title.gif hinzufügen. Da ein Bild für das CVS System Binärdaten darstellt, muss dies dem System mittels -kb mitgeteilt werden.
cvs commit -m "Bild und Webseite hinzugefügt" index.html title.gif Erst der Befehl commit fügt die Dateien in das Repository ein.

Der Befehl commit wird immer dann benutzt, wenn Änderungen im Repository vorgenommen werden sollen. Das System weisst dann den geänderten Dateien eine höhere Versionsnummer zu.

Falls nun mehrere Entwickler an dem Projekt arbeiten, dann ist es notwendig sich ab und zu die Änderungen, die in der Zwischenzeit gemacht wurden, zu holen. Dafür gibt es den Befehl update:

cvs update Projekt

Dann werden alle Änderungen in die Arbeitskopie übernommen. Normalerweise geht soetwas problemlos vonstatten, wurden jedoch Änderungen gemacht, die nahe bei Änderungen liegen, die wir selbst eingefügt haben, dann gibt es einen Konflikt. CVS wird die betreffenden Stellen markieren und wir müssen dafür Sorge tragen, dass wir diesen Konflikt selbst auflösen. Damit wir nicht in eine solche Situation geraten, ist Absprache zwischen den Beteiligten unbedingt erforderlich. Das System zwingt uns zudem zu einem Update, falls wir versuchen sollten eine veränderte Datei einzutragen, die im Repository in einer höheren Version vorliegt als die, die wir bearbeitet haben.

Mitten im Projektablauf entscheiden wir uns dazu das Bild wieder zu entfernen, da es nicht mehr ins Projekt passt. Dafür verwendet man den Befehl remove:

Eingabe Bedeutung
del title.gif Die Datei title.gif in der Arbeitskopie löschen. Falls wir uns anders entscheiden sollten, dann lässt sich die Datei mit update wieder herstellen.
cvs remove -m "Das Bild passt nicht mehr ins Konzept" title.gif Dem System mitteilen, dass wir die Datei title.gif löschen wollen. Falls wir uns doch noch umentscheiden sollten, dann kann man dies mit dem entsprechenden add Befehl wieder rückgängig machen.
cvs commit -m "Bild entfernt" title.gif Erst der Befehl commit löscht die Datei im Repository. Die Datei wird dann im Repository als gelöscht markiert, d.h. sie fehlt ab jetzt im aktuellen Projekt.

Angenommen, eine Änderung in der Datei index.html hat einen Fehler zur Folge. Man kann sich nun mühsam durch die Datei kämpfen, oder man lässt sich vom Versionskontrollsystem die Änderungen in der Datei anzeigen. Auf diese Weise wird der Suchkreis für den Fehler stark verkleinert. Der zugehörige Befehl heisst diff:

Eingabe Bedeutung
cvs diff index.html CVS soll unsere lokale Kopie von index.html mit der Version vergleichen, die wir ausgetragen haben.
cvs diff -r <Version> index.html CVS soll unsere lokale Kopie von index.html mit der Version vergleichen, die wir mit <Version> angegeben haben.
cvs checkout -r <Version> index.html Mit diesem Befehl tragen wir die Version <Version> der Datei index.html aus.

Haben wir unsere Arbeit beendet und unsere Änderungen sind eingetragen, so können wir unsere Arbeitskopie wieder löschen. Der zugehörige Befehl heisst release:

Eingabe Bedeutung
cd .. Ein Verzeichnis höher wechseln.
cvs release -d Projekt CVS untersucht unser Arbeitsverzeichnis, ob wir nicht doch vergessen haben etwas einzutragen. Nur wenn wir alle Veränderungen ins Repository eingetragen haben, wird das System das Verzeichnis Projekt löschen.

Wir hätten das Verzeichnis auch einfach löschen können, aber release ist in der Hinsicht einfach besser, da wir kein schlechtes Gewissen haben brauchen, ob wir nicht etwas vergessen haben. Wir erreichen damit das Ende der Einführung in die Grundfunktionen von CVS. Für das alltägliche Arbeiten mit CVS dürften diese eigentlich ausreichen.

englischsprachige Seite Concurrent Version System (CVS) Homepage

nach obennach unten

CVS im Internet

CVS kann man auch über das Internet benutzen, es unterstützt sogar Verschlüsselung mittels englischsprachige Seite SSH, was bei Projekten, bei denen Geld oder Konkurrenz im Spiel ist, auch dringend angebracht ist.

Liegt das Repository nicht auf dem eigenen Rechner, sondern ist über das Inter- bzw. Intranet erreichbar, so macht das nur an einer Stelle einen Unterschied, nämlich beim CVSROOT. Dieser muss nun auf den entfernten Rechner gesetzt sein. Das Format ist im allgemeinen:

:Methode:benutzername@rechnername:/Pfad/zum/Repository

Nehmen wir also an, der Rechner heisst cvs.beispiel.de, unser Benutzername wäre meier und das Repository liegt im Verzeichnis (Achtung, UNIX) /usr/cvsroot. Wir wollen wieder das Projekt "Projekt" austragen. Im ersten Versuch sind wir mal unvorsichtig und benutzen als Methode passwd. Das wird allerdings nur funktionieren, falls auf cvs.beispiel.de ein CVS Server läuft und wir auch einen gültigen Zugang zum Rechner cvs.beispiel.de haben:

Eingabe Bedeutung
cvs -d :passwd:meier@cvs.beispiel.de:/usr/cvsroot login Beim Rechner cvs.beispiel.de anmelden.
CVS password: Das Passwort übermitteln. Hier ist zu beachten, dass man blind tippt, d.h. man sieht seine Eingabe nicht (die Eingabe wird nicht einmal durch * maskiert).
cvs -d :passwd:meier@cvs.beispiel.de:/usr/cvsroot checkout Projekt Wie gewohnt das "Projekt" austragen.

Da wir aber wissen, dass auf diese Weise Passwörter und unsere Projektdateien im Klartext übertragen werden (d.h. unser Konkurrent kann unter Umständen diese Dateien mitlesen), verlassen wir uns lieber auf starke Verschlüsselung, in diesem Falle englischsprachige Seite SSH.

Wir nehmen an, cvs.beispiel.de ist ein UNIX - basierter Rechner, und auf diesem Rechner ist ein SSH Server am Laufen. Natürlich müssen wir ein existierender Benutzer des Rechners sein. Wir werden jetzt mit einer SSH Verbindung das Projekt "Projekt" austragen. Wir werden dies auf einem Rechner mit MS-Windows als Platform durchführen. Als SSH werden wir englischsprachige Seite PuTTY verwenden, das ist eine freie SSH-Software. Unabdingbar ist natürlich eine Vorhandene Installation von CVS auf unserem MS-Windows Rechner mit gesetztem Pfad (d.h. in der Kommandozeile genügt es, wenn man cvs eingibt).

Unser erster Schritt ist es, dass wir uns ohne Passwort auf dem Rechner cvs.beispiel.de anmelden können, dazu benötigen wir eine sogenannte RSA identity. Wir melden uns dazu mit Hilfe des Programmes putty.exe auf dem Rechner cvs.beispiel.de an. Wichtig ist dabei, dass wir als Protokoll SSH verwenden und nicht Telnet. Wir geben also in das Feld "Host Name" cvs.beispiel.de ein, und aktivieren den "SSH" Radiobutton. Nun können wir die Angaben mit dem Knopf "Open" bestätigen. PuTTY frägt uns dann, ob wir den Schlüssel des Rechners cvs.beispiel.de akzeptieren und ob der Schlüssel gespeichert werden soll, wir klicken auf "ja". Wenn wir nach Eingabe unseres Passwortes am System angemeldet sind und eine Kommandoeingabeaufforderung erscheint, dann geben wir folgende Befehle ein:

Eingabe Bedeutung
ssh-keygen Ein Schlüsselpaar erzeugen. Einer der beiden Schlüssel wird später zu unserer Identität.
Enter file in which to save the key (~/.ssh/identity): Den Ort, wo das Schlüsselpaar abgespeichert werden soll angeben. Der vorgeschlagene Ort sollte verwendet werden.
Enter passphrase (empty for no passphrase): Ein sicheres Passwort für unseren Schlüssel angeben. Achtung, hier tippt man wieder blind, man sieht also seine Eingabe nicht. Allerdings muss man das Passwort anschliessend gleich wieder verifizieren, es ist also sehr unwahrscheinlich, dass man hier ein falsches Passwort eingibt.
cd .ssh Ins Verzeichnis .ssh wechseln.
mv identity.pub authorized_keys Der private Schlüssel identity kann ab jetzt als Identität zum Anmelden beim Rechner cvs.beispiel.de verwendet werden.

Anschliessend kann man sich wieder abmelden. Nun muss der private Teil des Schlüssels, identity auf den Rechner mit MS-Windows importiert werden. Dazu verwenden wir das Programm pscp.exe. Nehmen wir wieder an, unser Name wäre meier, und unser Heimatverzeichnis auf dem Rechner cvs.beispiel.de wäre /home/meier. Dann importieren wir den Schlüssel nach C:\temp\identity mit folgendem Befehl:

pscp meier@cvs.beispiel.de:/home/meier/.ssh/identity c:\temp\identity

Diesen Teil des Schlüssel bewahren wir gut auf, denn er ist so eine Art Ausweis für den Rechner cvs.beispiel.de. Deshalb nennt man diesen Teil des Schlüsselpaares auch den privaten Teil. Auf keinen Fall dürfen Dritte Zugang zu diesem Schlüssel erhalten.

Wir starten jetzt pageant.exe. Ein Computer mit einem Hut dürfte bei der Uhr (im sogenannten SysTray) erscheinen. Mittels des Menüpunktes Add Key importieren wir den privaten Schlüssel in pageant.exe. Das Programm wird uns nach einem Passwort fragen. Hier muss man das Passwort eingeben, dass man bei der Erzeugung des Schlüsselpaares benutzt hat. Diesen Schritt muss man im Gegensatz zu den anderen Schritten beim Neustart von Windows immer wiederholen. Dies ist im Übrigen keine Schikane, sondern ein Beitrag zur Sicherheit, denn es könnte auch jemand anderes als wir den Computer benutzen und somit Zugriff zu unserer Identität erhalten. Ohne Passwort ist unsere Identität so gut wie nutzlos.

Bevor wir uns jetzt wirklich in Sicherheit wägen können müssen wir noch ein paar Variablen auf der Komandozeile setzen:

Variable Wert
CVS_RSH Diese Variable müssen wir auf den Pfad zum Programm plink.exe setzen.
CVS_SERVER Diese Variable müssen man auf das Programm cvs auf dem Rechner cvs.beispiel.de setzen. Den Wert erhalten wir mit Hilfe des Befehls which cvs (Natürlich müssen wir den Befehl auf dem Rechner cvs.beispiel.de ausführen).

Nun können wir getrost CVS benutzen, ohne uns Sorgen um unsere Daten oder Passwörter zu machen:

cvs -d :ext:meier@cvs.beispiel.de:/usr/cvsroot checkout Projekt

Zu beachten ist, dass wir als Methode ext und nicht mehr passwd benutzen.

nach obennach unten

Benutzeroberflächen für CVS

Auf die Dauer ist natürlich die Arbeit mit der Kommandozeile etwas nervend, besonders bei tief verschachtelten Verzeichnisstrukturen. Abhilfe bieten einem hier englischsprachige Seite Benutzeroberflächen, die die Funktionalität hinter Menüs und Buttons verstecken.

englischsprachige Seite CvsGui
Benutzeroberflächen für CVS

nach obennach unten

Weitere Informationen zu CVS

Weitere Informationen zu CVS findet man im englischsprachige Seite Manual, in der Mailingliste info-cvs, bei der man sich mit einer Mail an E-Mail info-cvs-request@gnu.org eintragen lassen kann oder in der Newsgruppe englischsprachige Seite comp.software.config-mgmt.

nach obennach unten

Andere Versionskontrollsysteme

Neben CVS gibt es noch weitere Versionskontrollsysteme. Die Auswahl erhebt natürlich keinen Anspruch auf Vollständigkeit. Der Autor kann und wird keinen Support bei den genannten Systemen leisten.

Kommerzielle Versionskontrollsysteme:

Freie Versionskontrollsysteme:

Siehe auch:

englischsprachige Seite Überblick über Versionskontrollsysteme
Dies ist ein FAQ Artikel der Newsgruppe englischsprachige Seite comp.software.config-mgmt, die sich mit Versionskontrollsystemen beschäftigt.

Teil von SELFHTML aktuell Teil von Artikel Teil von Projektverwaltung

© 2007 bereichsübergreifende Seite Impressum