Ausarbeitung - Department of Information Systems

Transcription

Ausarbeitung - Department of Information Systems
Westfälische Wilhelms- Universität Münster
Ausarbeitung
Werkzeuge zum Versions- und Variantenmanagement:
CVS/Subversion vs. ClearCase
Im Rahmen des Seminars
Skiseminar: Variantenmanagement
Lars Fischer
Themensteller: Prof. Dr. Herbert Kuchen
Betreuer: Prof. Dr. Herbert Kuchen
Institut für Wirtschaftsinformatik
Praktische Informatik in der Wirtschaft
Inhaltsverzeichnis
Inhaltsverzeichnis
1 Einleitung...................................................................................................................... 1
2 Anforderungen ............................................................................................................. 1
3 Werkzeuge und Funktionsweisen............................................................................... 2
3.1 Werkzeuge ............................................................................................................ 3
3.1.1 CVS .................................................................................................................. 3
3.1.2 Subversion ....................................................................................................... 3
3.1.3 ClearCase......................................................................................................... 3
3.2 Bestandteile und Funktionen .............................................................................. 4
3.2.1 Repository........................................................................................................ 4
3.2.2 Arbeitsbereich und Übertragung .................................................................. 6
3.2.3 Sperren und Merging ................................................................................... 10
3.2.4 Versionen, Revisionen .................................................................................. 16
3.2.5 Tags ................................................................................................................ 17
3.2.6 Branching ...................................................................................................... 19
4 Zusammenfassung und Ausblick.............................................................................. 21
1 Einleitung
1 Einleitung
Im Rahmen der Seminarreihe Variantenmanagement ist es das Ziel dieser Arbeit einen
Einblick in das Variantenmanagement in der Informatik, genauer gesagt, im Bereich der
Softwareentwicklung zu geben.
Variantenmanagement wird also nicht nur in der Betriebswirtschaftslehre benutzt, sondern auch im Bereich der Informatik. Die Bezeichnung ändert sich allerdings. Statt von
Variantenmanagement redet man nun von Versionsverwaltung.
In der Literatur existieren verschiedene Definitionen. Eine passende ist die von Jennifer
Vespermann. Sie beschreibt Versionsverwaltung als den Prozess vom Aufzeichnen und
Erhalten von Änderungen der Daten in einem Projekt [EsCVS03].
Was damit im Detail gemeint ist, stellt den Inhalt der Seminararbeit dar. Im weiteren
Verlauf werde ich zunächst auf einige Anforderungen an ein Versionsverwaltungssystem eingehen, bevor dann die einzelnen Bestandteile, ihre Funktionsweisen und die entsprechenden Werkzeuge vorgestellt werden.
2 Anforderungen
Aus der Definition ist also zu erkennen, dass ein Versionsverwaltungssystem mit Projektdaten arbeitet und den Prozess der Softwareentwicklung unterstützen soll. Diese
allgemeinen Anforderungen sollen im Folgenden auf verschiedene Erfolgsfaktoren herunter gebrochen werden und die einzelnen funktionellen Forderungen an das Versionsverwaltungssystem beschrieben werden.
Datenintegrität
Ein Versionsverwaltungssystem soll die Integrität aller Projektdaten sicherstellen. Zum
einen sollen Daten nicht verloren gehen, zum anderen sollen fehlerhafte Veränderungen
rückgängig gemacht werden können.
Produktivität
Ein Erfolgsfaktor von Softwareprojekten ist die Produktivität. Es soll in möglichst kurzer Zeit möglichst ein perfektes Produkt entwickelt werden. Die soll durch ein Versionsverwaltungssystem unterstützt werden. Die Möglichkeit zur Produktivitätssteigerung
tritt in vielen Bereichen eines Softwareprojektes auf. Paralleles Arbeiten auf den glei-1-
2 Anforderungen
chen Daten, Verhindern von „doppelter“ Arbeit, Vereinfachung des Testens oder die
Wiederherstellung von altem Code nach einer Fehlentwicklung sind einige Beispiele.
Zurechenbarkeit
Es besteht die Anforderung, klar erkennen zu können, wer zu welchem Zeitpunkt was in
den Projektdaten verändert hat. Zum einen um den Mitarbeiter für schwerwiegende
Fehler verantwortlich machen zu können, zum anderen um die Kommunikation unter
Mitarbeitern zu erleichtern.
Entwicklungszweige
Während der Entwicklung einer Software kann die Situation auftreten, dass verschiedene Teams der Mitarbeiter verschiedene Ziele erreichen wollen, z.B. Weiterbearbeitung
des Codes gegenüber dem Erstellen einer Testversion für den Kunden. Sinnvoll ist dann
die Trennung der zu verrichtenden Arbeit, jedes Team arbeitet an getrenntem Code zur
Erreichung des Ziels. Diese getrennte Bearbeitung soll unterstützt werden.
Protokollierung
Weiterhin sollen Änderungen nicht einfach nur im Code ersichtlich sein, sondern die
Mitarbeiter sollen wissen, warum und was ein anderer Kollege geändert hat. Dies fördert das Verständnis und erleichtert die weitere Entwicklung. Zu diesem Zweck sollen
Änderungen mit Kommentaren versehen werden können.
Verteilte Arbeit
Aufgrund der technologischen Entwicklung werden viele Projekte nicht an einem Ort
ausgeführt, sondern sind eher durch räumliche, bzw. örtliche Trennung gekennzeichnet.
Ein Versionsverwaltungssystem soll trotz dieser Trennung die gemeinschaftliche Arbeit
unterstützen.
3 Werkzeuge und Funktionsweisen
Nach der bisherigen allgemeinen Einführung in die Versionsverwaltung wird in diesem
Kapitel detaillierter auf die wichtigsten Funktionsbereiche eines solchen Systems eingegangen und diese anhand von Beispielen in verschiedenen Werkzeugen vorgestellt.
-2-
3.1 Werkzeuge
3.1 Werkzeuge
Bei den betrachteten Werkzeugen handelt es sich um das Concurrent Version System
(CVS), Subversion und ClearCase. Es existieren neben diesen Programmen noch eine
Reihe weiterer, deren Betrachtung hier aber keine Rolle spielt.
3.1.1 CVS
Das Concurrent Version System, kurz CVS, ist ein Programm zur Versionsverwaltung
von Dateien, welches hauptsächlich in der Softwareentwicklung angewendet wird, also
in dem hier behandelten Kontext. Grundsätzlich ist es ein reines KommandozeilenProgramm. Es ist für alle Betriebssysteme entwickelt und geeignet. Zudem sind grafische Oberflächen für die verschiedenen Systeme erhältlich.
Eine wichtige Eigenschaft von CVS ist der Open-Source-Gedanke. Das Programm benötigt keine Lizenzen und ist frei im Internet erhältlich.
Historisch gesehen ist CVS eine Weiterentwicklung eines älteren Systems, dem Revision Control System. Auf die Funktionen und Arbeitsweise von CVS wird in den Kapiteln 3.2 bis 3.7 genauer eingegangen.
3.1.2 Subversion
Wie auch das eben beschriebene CVS ist Subversion ein Open-Source-Programm. Häufig wird es auch als Nachfolger von CVS gehandelt und ersetzt dieses allmählich. Auch
Subversion ist für alle Betriebssysteme geeignet und läuft grundsätzlich auf Kommandozeilen-Ebene. Allerdings sind auch hier zahlreiche grafische Oberflächen entwickelt
worden.
Es behebt einige Schwächen von CVS und ist von der Bedienung ähnlich gehalten.
Grundsätzlich handelt es sich bei Subversion allerdings um ein eigenes Projekt, welches
erst im Februar 2004 die erste stabile Version veröffentlichte.
Die Unterschiede und Gemeinsamkeiten zu CVS werden in den weiteren Kapiteln deutlich gemacht.
3.1.3 ClearCase
-3-
3.1.3 ClearCase
Das Versionsverwaltungssystem ClearCase ist in der Reihe der Rational Software von
IBM erschienen. Es handelt sich um proprietäre Software, die eben von IBM vertrieben
wird. ClearCase wird vornehmlich in großen Softwareprojekten verwendet, was unter
anderem an den Kosten für die Lizenzen liegt, die sehr hoch sind. Weiterhin ist ClearCase hauptsächlich für Windows ausgelegt, ansonsten läuft es nur auf einigen ausgewählten UNIX-Systemen, z.B. nicht auf MacOS X.
Im Unterschied zu den beiden anderen Systemen ist eine grafische Oberfläche direkter
Bestandteil des Programms, viele Funktionen lassen sich sogar auf Windows-Systemen
über den Datei-Explorer bedienen. Allerdings besteht auch die Möglichkeit über Kommandozeilen Befehle auszuführen.
ClearCase ist im Wesentlichen deutlich komplexer, aber auch leistungsfähiger als CVS
und Subversion. Aus diesem Grund wird ClearCase auch vor allem in großen Projekten
angewendet.
3.2 Bestandteile und Funktionen
Der Inhalt dieses Kapitels besteht aus der Beschreibung der einzelnen Bestandteile der
Versionsverwaltungssysteme und wie diese zusammen arbeiten und vom Anwender
kontrolliert und genutzt werden können.
3.2.1 Repository
Das Repository ist ein elementarer Bestandteil eines Versionsverwaltungssystems. Es
wird auch Kern des Systems bezeichnet. Es ist ein zentraler Speicher, in welchem alle
Projektdaten im Lebenszyklus eines Softwareproduktes gespeichert werden. Zunächst
müssen aber die zu speichernden Daten definiert sein. Dies ist nicht nur der Quellcode,
sondern alle Daten, die benötigt werden, um eine lauffähige Version der Applikation
herstellen zu können [PVC03, S.9].
Grundsätzlich werden die Daten in einem Dateisystembaum gespeichert. Es besteht eine
Hierarchie von Verzeichnissen und Dateien. Das Repository ähnelt also einem normalen
Dateiserver. Es biete aber eine deutlich höhere Funktionalität. Denn es werden nicht nur
die Daten gespeichert, sondern auch jede einzelne Änderung in der Verzeichnisstruktur,
bzw. der Dateien. Die Art der Speicherung ist verschieden. Manche Systeme verwenden
eine Datenbank, manche spezielle Dateiformate und andere Kombinationen aus beidem.
-4-
3.2.1 Repository
Stellt man sich das Repository nun als Server vor und die Entwickler als Clients, entsteht eine bekannte Struktur. Die Clients haben die Möglichkeit Daten vom Server zu
lesen und auf ihn zu übertragen. Neben den aktuellen Daten können auch ältere Versionen der Daten abgerufen werden. Denn jede Revision jeder Datei verbleibt im Repository. Allerdings werden in den meisten Versionsverwaltungssystemen nicht alle Revisionen einer Datei komplett gespeichert, denn dies würde einen sehr hohen Speicherbedarf
bedeuteten. Um dies zu vermeiden, vergleicht das System die ältere und neue Revision
einer Datei und speichert nur die Änderungen ab. So wird viel Speicherplatz gespart.
Das Repository ist immer angebunden an ein Netzwerk. Dies kann ein internes Netzwerk innerhalb einer Unternehmung sein oder ein lokales auf einem Rechner, aber auch
das Internet bei größeren örtlichen Entfernungen.
Das Repository spielt also eine wichtige Rolle. Ergo ist die Sicherheit ein Thema. Das
Repository sollte auf einem sicheren und zuverlässigen Rechner gespeichert sein. Der
Verlust wäre für ein Softwareprojekt fatal [PVC03, S.8]
In dem Versionsverwaltungssystem CVS ist das Repository eine Art Dateiserver mit
einem Verzeichnisbaum. Es existiert ein Verzeichnis für die allgemeine Konfiguration
und ein Verzeichnis für jedes Projekt. Jede Datei des Projektes wird nun in dem zugehörigen Verzeichnis gespeichert. Allerdings nicht nur die Datei, sondern mit ihr noch Zusatzinformationen wie Unterschiede zu vorherigen Versionen, Zeitpunkt der Änderung,
Kommentar vom Entwickler, dem Namen des Entwicklers und der Versionsnummer.
Das Format dieser Datei wurde übernommen aus dem Vorgänger RCS.
CVS arbeitet folgendermaßen: In der praktischen Anwendung muss das Repository
zunächst gebildet werden:
$ cvs –d C:\sandbox init
Nun existiert das Repository, aber noch kein Projekt. Dazu müssen nun Dateien in das
Repository eingefügt werden. In einem Verzeichnis „cvs“ liegen zwei Textdateien Farben.txt und Zahlen.txt. Dies werden nun in das Repository geladen:
$ cvs> cvs –d C:\Sandbox import –m „“ Lala
CVS - Antwort:
N Lala/Farben.txt
N Lala/Uahlen.txt
No conflicts created by this import
Damit sind die Dateien im Repository und ich habe das Projekt Lala genannt.
In dem Versionsverwaltungssystem Subversion ist der grundlegende Unterschied, dass
das Repository zum einen in einer Berkley Datenbank, aber auch direkt im Dateisystem
-5-
3.2.1 Repository
gespeichert werden kann [WIKIS]. Ansonsten laufen die Befehle ähnlich ab. Sie haben
nur einen anderen Namen. So wir das Repository mit dem Befehl
$ svnadmin create Pfad/zum/Repository angelegt
angelegt und importiert wird über die Funktion
$ svn import /daten/ file:///c:/Pfad/zum/Repository
ClearCase nennt sein Repository VOB (Versioned Object Base). In ihm speichert es alle
Elemente eines Projektes. Bei sehr großen Projekten ist es auch möglich und üblich
mehrere VOB`s anzulegen [IBM03, S.2]. Die Einrichtung in ClearCase erfolgt über den
ClearCase Explorer oder den entsprechenden Befehl auf Kommandozeilen - Ebene.
3.2.2 Arbeitsbereich und Übertragung
Wie eben beschrieben, liegen die Daten zentral im Repository. Dort sind sie aber nur
gespeichert. Sie können zwar abgerufen, aber es kann nicht auf ihnen gearbeitet werden.
Für die Änderung der Daten benötigen die Entwickler eine Kopie auf ihrem Rechner,
die so genannte Arbeitskopie in ihrem Arbeitsbereich. Diese Arbeitskopie muss nicht
sämtliche Projektdaten enthalten. Es besteht auch die Möglichkeit nur eine Teilmenge
auf den eigenen Rechner zu kopieren.
Extrem wichtig ist nun natürlich die Frage, wie die Kommunikation zwischen dem Arbeitsbereich und dem Repository abläuft. Grundsätzlich gibt es nur zwei Richtungen.
Entweder ein Entwickler will die aktuellen Daten aus dem Repository in seinen Arbeitsbereich kopieren oder er möchte seine Änderungen in das Repository einstellen.
Der typische Verlauf der Kommunikation hat als Anfang immer die Initiative des Entwicklers. Um an dem gewünschten Code arbeiten zu können, benötigt er die aktuelle
Revision der Datei in seinem Arbeitsbereich. Dieser Kopiervorgang wird als „check
out“ bezeichnet. Danach kann der Mitarbeiter an dem Code arbeiten. Hat er seine Änderungen vollendet, muss er diese in das Repository einstellen. Dieser Vorgang wird als
„commit“ oder „check in“ bezeichnet.
Weiterhin gibt es noch die Möglichkeit des Updates. Mit dieser Funktion kann man sich
während des Bearbeitens von Dateien die aktuellsten Versionen aus dem Repository
laden. Die Ähnlichkeit zu „check out“ ist unverkennbar.
So einfach wie dies alles klingt ist es in der Realität aber leider nicht. Wenn ein Versionsverwaltungssystem eingesetzt wird, arbeiten meist mehrere Entwickler an einem
Projekt und somit auf den gleichen Daten. Dies birgt Gefahren. Was passiert, wenn
-6-
3.2.2 Arbeitsbereich und Übertragung
zwei Entwickler an der gleichen Datei arbeiten? Folgendes einfaches Szenario stellt die
Probleme dar:
Entwickler A und B kommen morgens zur Arbeit und aktualisieren beide ihre Arbeitskopie. Person A macht dies zur gleichen Zeit wie Person B. Beide arbeiten nun an der
gleichen Datei „Beispiel.java“ in der gleichen Revision. Entwickler A macht um 12 Uhr
Mittagspause und „commitet“ seine Änderungen. Person B macht aber erst um 12:30
Pause und stellt seine Änderungen ebenfalls in das Repository ein. Was ist aber nun mit
den Änderungen von Person A? Sind sie überschrieben und damit komplett verschwunden?
Es ist zu erkennen, dass die Kontrolle des gemeinsamen Zugriffs auf Dateien ein wesentlicher Bestandteil eines Versionsverwaltungssystems darstellt. Deswegen widmet
sich die Arbeit in einem Kapitel genau diesem Problem später im Detail. Dort wird es
dann um Lösungsansätze wie Sperren und Merging gehen.
Ein weiterer Punkt, der bei der Kommunikation eine Rolle spielt, ist die Sicherheit. Ist
das Repository auf dem eigenen Rechner oder im lokalen Firmennetzwerk angelegt, ist
das Risiko nicht so hoch. Basiert die Struktur des Projektes aber auf einer weiten örtlichen Verteilung der Mitarbeiter mit Nutzung des Internets, ist dieser Aspekt nicht zu
vernachlässigen. Denn generierter Quellcode, der sowohl beim check out als auch beim
commit übertragen wird, soll sicher nicht in die falschen Hände geraten. Es ist also erforderlich die Übertragung zu sichern. Zum einen kann dies durch die Authentifizierung
der Benutzer geschehen und zum anderen durch die Sicherung der eigentlichen Übertragung. Aber nun zur Arbeitsweise der einzelnen Werkzeuge.
Wieder beginne ich bei der Darstellung der einzelnen Systeme mit CVS. Gegeben ist
das gleiche Projekt wie in Kapitel 3.2.1. Zunächst muss der Benutzer sein Arbeitsverzeichnis für sich definieren. Jetzt sei es c:\work. Dann müssen die Daten aus dem Projekt in das Arbeitsverzeichnis eingefügt werden:
C:\work> cvs –d C:\sandbox checkout Lala
Antwort von CVS:
cvs checkout: Updating Lala
U Lala/Farben.txt
U Lala/Zahlen.txt
Nun sind die Dateien im Arbeitsverzeichnis und es kann an ihnen gearbeitet werden.
Das „U“ in den beiden letzten Zeilen verdeutlicht nur, dass es sich bei den Dateien um
ein Update handelt.
CVS bietet im Bereich der Kommunikation folgende Eigenschaften. Zum einen ist es
-7-
3.2.2 Arbeitsbereich und Übertragung
ein klassisches Client-Server-Modell. Die Kommunikation der Clients mit dem Server
kann über verschiedene Methoden ablaufen. Eine Möglichkeit ist die :pserver: Methode.
Hier findet eine einfache Socket - Verbindung mit Authentifizierung der Clients statt.
Problematisch ist allerdings die unverschlüsselte Übertragung der Daten und die zu geringe Sicherung der Authentifizierung. Eine andere Methode ist das rsh – Protokoll. Ein
Vorteil dieser Methode ist, dass die Authentifizierung nicht über Passwortdaten funktioniert, sondern über eine Betriebssystemauthentifizierung. Allerdings werden weiterhin
alle Daten unverschlüsselt übertragen. Die letzte Möglichkeit ist die der „secure shells“
(ssh). Hier werden Daten nach genormten Sicherheitsstandards übertragen. Allerdings
ist CVS in diesem Falle nur das ausführende Organ von ssh, da CVS diese Sicherheitsaspekte nicht selber anbietet, sondern sich auf andere Hersteller verlässt [PVC03, S.51]
In der Praxis läuft die Kommunikation folgendermaßen ab. Der Befehl „check out“
wurde schon kurz angesprochen.
Der Befehl
C:\work> cvs –d C:\sandbox checkout Lala
führt dazu, dass CVS alle Dateien in meinem Arbeitsbereich aktualisiert und ich somit
an der letzten Revision der Dateien, also dem aktuellen Release, arbeiten kann.
Habe ich dann die Datei Farben.txt geändert, muss ich diese in das Repository schreiben. Dies wird folgendermaßen ausgeführt:
C:\work> cvs –d C:\sandbox commit Lala/Farben.txt
Während der Ausführung öffnet sich ein Editor Fenster, indem dann noch zusätzliche
Informationen in einer Log-Datei angegeben werden können. Dann kommt die Antwort
von CVS:
Checking in Lala/Farben.txt;
C:\sandbox\Lala\Farben.txt,v
<- - Farben.txt
New revision: 1.2; previous revision: 1.1
done
Die Arbeitsweise der Funktion „update“ wird im nächsten Kapitel erläutert, da sie dort
eine gewichtige Rolle spielt.
In Subversion funktioniert das check out analog mit folgender Gestalt des Befehls:
$ svn checkout file:///c:/Pfad /zum/Repository
wobei der Befehl aus dem Verzeichnis der Arbeitskopie gestartet wird.
Bezüglich der Sicherheit bietet Subversion eine gute Unterstützung. Zum einen kann ein
Protokoll benutzt werden, was sich WebDAV + DeltaV nennt und über https gesichert
-8-
3.2.2 Arbeitsbereich und Übertragung
werden kann, oder ein weiteres eigenes Protokoll, dass durch die bereits erwähnten SSH
- Verbindung geschützt wird [VCSUB04, S.103]
Die Übertragung in das Repository läuft ähnlich wie in CVS, benötigt nur weniger Angaben. Habe ich eine Datei „xy“ geändert und ich befinde mich in meinem Arbeitsverzeichnis reicht der Befehl
$ svn commit –m „Datei xy geändert“
aus. Es wird dann nur die geänderte Datei übertragen und die Revisionsnummer inkrementiert. Der Anhang „-m“ hat nur die Bedeutung, dass der folgende Text als Kommentar eingefügt wird. Ein wesentlicher Unterschied zu CVS ist die Atomarität der Transaktionen. Dies ist ein Problem von CVS, denn dort sind die „commit“ Operationen nicht
atomar. Die Daten im Repository können also inkonsistent sein. Subversion bietet im
Gegensatz dazu die Atomarität an.
Im Falle von ClearCase arbeitet der Entwickler auf einer Sicht des Repositories. Möglich sind hier einmal „snapshot views“ und zum anderen „dynamic Views“. Die erste
Sicht stellt eine Kopie des VOB auf dem eigenen Rechner dar. Die dynamische Sicht
benutzt das „multiversion file system“, welches von ClearCase zur Verfügung gestellt
wird. Es bietet einen aktuellen und transparenten Zugriff auf die Daten in der VOB,
ohne diese auf den eigenen Rechner zu kopieren. Bei der Erstellung einer Sicht kann
man wählen, ob lieber eine statische oder eine dynamische Sicht benutzen möchte. Dies
geschieht über den „View Creation Wizard“, in dem dann auch Verzeichnisse für die
Speicherung bzw. für die dynamische Benennung angegeben werden müssen [IBM03,
S.23].Technisch gesehen wird eine Konfigurationsspezifikation, die config spec ausgewertet. Auch auf die beschriebenen Funktionen „commit“ und „check out“ kann in
ClearCase über die grafische Oberfläche zugegriffen werden. Beim „check out“ muss
im ClearCase Explorer in das entsprechende Verzeichnis des VOB`s navigiert werden
und auf die Windows-Art mit der rechten Maustaste auf der gewählten Datei der Befehl
„check out“ gewählt werden. Auch hier kann wieder ein Kommentar eingefügt werden.
Weiterhin existieren zwei Möglichkeiten der Übertragung an das Repository. Das reservierte und das unreservierte „check out“. Reserviert bedeutet hier, dass nur die eine
Sicht auf das VOB das Recht hat, eine Datei im Repository zu aktualisieren, sie also im
Prinzip eine Sperre auf der Datei hält. Unreserviert meint, dass nicht garantiert ist, dass
die übertragene Datei auch wirklich in dieser Revision im Repository steht [IBM03, S.
44]. Der bisher als „commit“ beschriebene Befehl nennt sich in ClearCase „check in“
und ist wie „check out“ über die rechte Maustaste erreichbar. Auch beim „check in“
-9-
3.2.2 Arbeitsbereich und Übertragung
können wieder Kommentare vom Entwickler angegeben werden. Allerdings muss hier
beiden Befehlen wieder zwischen der statischen und der dynamischen Sicht unterschieden werden [IBM03, S.46].
3.2.3 Sperren und Merging
Wie eben beschrieben birgt der gemeinsame Zugriff auf Daten die Gefahr, dass Änderungen verloren gehen können. Noch einmal zur Erinnerung, folgende Situation soll
vermieden werden. Entwickler A und B arbeiten am Code derselben Datei derselben
Revision. Entwickler A stellt seine Änderungen in das Repository ein. Später tut dies
Entwickler B ebenso. Existieren keine Regeln des gemeinsamen Zugriffs, gehen die
Änderungen des Entwicklers A verloren, bzw. sind in der aktuellen Revision der Datei
nicht mehr existent. Zur Lösung dieses Problems gibt es in Versionsverwaltungssystemen grundsätzlich zwei Lösungen. Zum einen das Sperren von Dateien und zum anderen das Merging, also Zusammenfügen von Dateien.
Das Sperrverfahren läuft folgendermaßen ab. Bevor ein Entwickler an einer Datei arbeiten kann, muss er die Datei sperren. Ist dies geschehen, können andere Mitarbeiter diese
Datei zwar noch lesen, aber nicht mehr bearbeiten [VCSUB04, Kapitel 2.2.2]. Ein Beispiel ist in Abbildung 1 dargestellt:
Entwickler B
Repository
Entwickler A
Beispiel.java
sperren
checkout
Entwickler A sperrt Datei Beispiel. Java und kopiert sie in
seinen Arbeitsbereich
Versuch schlägt fehl, Datei
bereits gesperrt
ändern
Entwickler A hat Datei verändert, schickt sie zum Repository
und entsperrt sie
Entwickler B möchte Datei Beispiel.java sperren
commit
entsperren
Beispiel.java
checkout
sperren
Jetzt kann Entwickler B Datei
Beispiel.java sperren und lesen
Abbildung 1: Sperrverfahren
-10-
3.2.3 Sperren und Merging
Es ist also zu erkennen, dass das Sperrverfahren das oben beschriebene Problem löst. Es
gehen also keine Änderungen verloren. Gemeinsamer schreibender Zugriff auf eine
Datei findet nicht statt.
Allerdings birgt diese Lösung auch einige Nachteile. Zum einen könnte Entwickler A
vergessen, die Sperre auf der Datei Beispiel.java aufzuheben. Dies hätte zur Folge, dass
Entwickler B unnötig lange warten müsste, bis er seine Änderungen durchführen kann.
Eventuell muss sogar erst der Administrator die Sperre der Datei aufheben. Es besteht
also die Möglichkeit, dass die Produktivität aufgrund dieses Verfahrens stark zurückgeht.
Weiterhin impliziert das Sperren die Verhinderung jeglichen gemeinsamen schreibenden Zugriffs auf eine Datei. Dies ist aber nicht unbedingt notwendig. Arbeiten zwei
Entwickler zum Beispiel an komplett unterschiedlichen Teilen des Codes einer Datei,
besteht kein Grund, warum sie dies nicht gleichzeitig tun sollten. Die Änderungen
könnten nach Bearbeitung zusammengefügt werden.
Eine andere Möglichkeit der Organisation des gemeinsamen Zugriffs ist das so genannte Merging, was auch als optimistisches Sperren bezeichnet wird. Es ist nicht so strikt
wie das Sperrverfahren und erlaubt mehreren Entwicklern Änderungen einer Datei zur
gleichen Zeit. Der Ablauf ist folgendermaßen organisiert. Entwickler A und B wollen
die gleiche Datei Beispiel.java bearbeiten. Sie holen sich per „check out“ die gleiche
Revision in ihre Arbeitskopie und führen ihre Änderungen durch. Entwickler A schreibt
nun als erster seine Änderungen per commit in das Repository zurück. Kurze Zeit später
tut dies auch Entwickler B, der nun eine Nachricht vom Versionsverwaltungssystem
erhält, dass nicht die aktuellste Version der Datei in seiner Arbeitskopie enthalten ist.
Durch ein Update erhält Entwickler B die aktuelle Version. Nun besteht zum einen die
Möglichkeit, dass die Änderungen von Entwickler A nicht mit denen von Entwickler B
kollidieren, die Dateien können zusammengefügt werden und ins Repository geschrieben werden [VCSUB, Kapitel 2.2.2]. Es sind nun alle gemachten Änderungen in der
aktuellen Version enthalten. Dieser Ablauf wird in Abbildung 2 dargestellt:
-11-
3.2.3 Sperren und Merging
Entwickler A
lesen
public class Beispiel {
public string getName ( ) {
return „Lars“;
}
public int getSize ( ) {
return „180“;
}
}
Repository
Entwickler B
public class Beispiel {
public string getName ( ) {
return „Lars“;
}
public int getSize ( ) {
return „180“;
}
}
lesen
public class Beispiel {
public string getName ( ) {
return „Lars“;
}
public int getSize ( ) {
return „180“;
}
}
ändern
…
public string getName ( ) {
return „Fischer“;
}
…
ändern
commit
public class Beispiel {
public string getName ( ) {
return „Fischer“;
}
public int getSize ( ) {
return „180“;
}
}
…
public int getSize ( ) {
return „190“;
}
…
commit
Konflikt!
Entwickler hat nicht aktuellste
Version von Datei
Update und
zusammenfügen
commit
public class Beispiel {
public string getName ( ) {
return „Fischer“;
}
public int getSize ( ) {
return „190“;
}
}
public class Beispiel {
public string getName ( ) {
return „Fischer“;
}
public int getSize ( ) {
return „190“;
}
}
Abbildung 2: optimistisches Sperren
-12-
3.2.3 Sperren und Merging
Wenn also zwei Entwickler unterschiedliche Teile einer Datei ändern, sind alle Änderungen in der aktuellen Revision im Repository enthalten. In der Situation, in der Entwickler B das commit ausführen will, erkennt das Versionsverwaltungssystem, dass die
Arbeitskopie von „B“ nicht aktuell ist. Es führt also das Update aus, erkennt, dass die
Änderungen nicht untereinander kollidieren und führt das commit aus.
Was passiert aber wenn beide gleiche Codezeilen verändern wollen. Im obigen Beispiel
wollen sowohl Entwickler A als auch B den Namen (Zeile 3) ändern. Bis zum dem
Zeitpunkt wo „B“ das commit ausführen will ist der Ablauf der gleiche. Das System
erkennt in diesem Augenblick (commit von „B“) aber wieder einen Konflikt. Nun ist
das System aber in der Lage zu erkennen, dass die gleiche Zeile Code in der Bearbeitungszeit der Datei bereits von „A“ geändert wurde. Um diese Änderungen nicht zu
verwerfen, zeigt das System nun Entwickler „B“ beide Möglichkeiten der Datei an, also
seine und die des Entwicklers A. Nun kann Entwickler B, eventuell nach Kontaktaufnahme mit Entwickler A, entscheiden, welche der beiden Möglichkeiten er wählt.
Gegenüber dem Sperrverfahren hat das Merging den Vorteil, dass viele Entwickler
wirklich parallel arbeiten können. Sie müssen nicht auf das Aufheben von Sperren warten. Somit entstehen keine langen Leerlaufzeiten, also eine höhere Produktivität.
Die Vermutung, dass durch das gleichzeitige Bearbeiten der gleichen Dateien viele
Probleme entstehen können ist eher unbegründet. In der Praxis ist es selten der Fall,
dass mehrere Entwickler die gleichen Codezeilen ändern [VCSUB04, Kap. 2.2.2].
Wenn dies dann tatsächlich passiert, ist der Erfolg des Systems von der Kommunikation
der Entwickler untereinander abhängig. Die Entwickler müssen untereinander abstimmen, welche Lösung für ihr Projekt die Beste ist.
Ein Kritikpunkt an beiden Verfahren ist die Fokussierung auf nur eine Datei. Bearbeiten
zwei Entwickler zwei verschiedene Dateien, bei denen aber Interdependenzen bestehen
und sprechen sich nicht ab, reagieren beide Verfahren nicht, aber die geänderten Dateien können zu einer nicht arbeitenden Version führen. Es müssen also erst Funktionstests
durchgeführt werden,
Interessant ist nun, wie CVS, Subversion und ClearCase vorgehen. CVS benutzt das
optimistische Sperrverfahren [OSD03, S.18]. Dies lässt sich gut an dem bereits behandelten Beispiel aus Abbildung 2 erklären und erkennen. Es existieren zwei Arbeitsbereiche C:\work und C:\work2, die nun Entwickler A und Entwickler B entsprechen. Wie
in Abbildung 2, ändert Entwickler A die dritte Zeile und Entwickler B die sechste Zeile
der Datei. Nun will Entwickler A seine Änderungen in das Repository schreiben. Er tut
-13-
3.2.3 Sperren und Merging
dieses mit dem Befehl commit:
C:\work> cvs –d C:\sandbox commit Lala/Beispiel.java
Antwort von CVS:
Checking in Lala/Beispiel.java;
C:\sandbox/Lala/Beispiel.java,v
<--
Beispiel.java
new revision: 1.2; previous revision: 1.1
done
Nun ist die Revision von Entwickler A im Repository. Entwickler B legt nach und führt
ebenfalls commit aus:
C:\work2> cvs –d C:\sandbox commit Lala/Beispiel.java
Antwort von CVS:
cvs commit: Up-to-date check failed for
`Lala/Beispiel.java'
cvs [commit aborted]: correct above errors first!
Die Revision der Datei ist also nicht mehr aktuell und CVS sagt dem Entwickler, er soll
ein update durchführen:
C:\work2> cvs –d C:\sandbox update Lala/Beispiel.java
Antwort von CVS:
RCS file: C:\sandbox/Lala/Beispiel.java,v
retrieving revision 1.1
retrieving revision 1.2
Merging differences between 1.1 and 1.2 into
Beispiel.java
M Lala/Beispiel.java
cvs update: in directory Lala/Beispiel.java:
Es ist zu erkennen, dass CVS die beiden Versionen der Datei zusammengefügt hat in
eine neue Version der Datei. Nun sind sowohl die Änderungen von Entwickler A, als
auch von B enthalten, obwohl beide gleichzeitig an der Datei gearbeitet haben.
Aber was macht das System, wenn beide Entwickler die gleiche Zeile verändern. Entwickler A ändert nun den Namen in „Fischer“ und Entwickler B selbigen in „Schwimmer“. Zunächst ist der Ablauf identisch. Entwickler A überträgt seine Revision in das
Repository. Nun will dies auch Entwickler B mit dem bekannten Befehl commit tun. Er
erhält auch zunächst die gleiche Nachricht, also die Aufforderung nach einem update,
was er dann ausführt:
C:\work2> cvs –d C:\sandbox update Lala/Beispiel.java
-14-
3.2.3 Sperren und Merging
Antwort von CVS:
RCS file: C:\sandbox/Lala/Beispiel.java,v
retrieving revision 1.2
retrieving revision 1.3
Merging differences between 1.2 and 1.3 into
Beispiel.java
rcsmerge: warning: conflicts during merge
cvs update: conflicts found in Lala/Beispiel.java
C Lala/Beispiel.java
cvs update: in directory Lala/Beispiel.java:
In diesem Fall erkennt CVS also, dass es die Änderungen nicht verschmelzen kann und
meldet dies dem Nutzer. Es findet trotzdem ein Update statt. Entwickler B hat nun in
seiner Datei Beispiel.java beide Versionen:
public class Beispiel {
public string getName ( ) {
<<<<<<< Beispiel.java
return „Schwimmer“;
=======
return „Fischerman“;
>>>>>>> 1.3
}
public int getSize ( ) {
return „200“;
}
}
Die kursiv geschriebenen Zeilen stellen nun das Resultat von CVS dar. Entwickler B
sieht beide Versionen und kann sich nun mit Entwickler A in Verbindung setzten und
beraten, welche die Richtige ist. Wenn er sich entschieden hat, muss er nur noch den
Code dementsprechend verändern und kann das commit durchführen ohne einen Fehler
zu erhalten.
In Subversion ist die Konfliktauflösung wie in CVS geregelt [SUVCS05, Kap. 2.1].
Einziger Unterschied ist die etwas andere Syntax der Befehle, die ja schon in den vorherigen Kapiteln zu sehen war. Dieser Unterschied ist allerdings zu vernachlässigen, da
beide Systeme prinzipiell auf die gleiche Weise arbeiten. Ein detailliertes Bespiel ist
-15-
3.2.3 Sperren und Merging
hier [SUVCS05, Kap. 4.10] zu finden.
In diesem Bereich stellt ClearCase einen anderen Vertreter dar. Die größere Komplexität des Systems wurde schon angesprochen und zeigt sich hier. Als Standart ist das pessimistische Sperrverfahren, also das in Abbildung 1 gezeigte Verfahren zu nutzen. Das
System kann aber angepasst werden, so dass das optimistische Sperren Anwendung
finden kann. Die Wahl liegt beim Benutzer.
3.2.4 Versionen, Revisionen
Der Begriff Version ist in der Arbeit schon häufiger gefallen. Nun geht es darum ihn
etwas genauer zu beleuchten. Interessant ist die Frage, wie ein Versionsverwaltungssystem Versionsnummern, bzw. Revisionsnummern vergibt und was sich aus ihnen erkennen lässt.
Um dies zu klären, ist es wichtig daran zu denken, dass im Repository nicht nur die aktuellen Daten, sonder alle jemals erstellten Daten gespeichert sind. Also jede Revision
jeder Datei. Weiterhin ist für jede Datei das Änderungsdatum und eventuell ein Kommentar des Entwicklers enthalten.
Hat die Datei Beispiel.java also zu Beginn die Revisionsnummer 1.1 erhält sie nach
einer Änderung die Nummer 1.2. Das klingt einfach, ist es aber leider nicht. In den verschiedenen Versionsverwaltungssystemen gibt es keine einheitliche Handhabung, wie
Änderungen nummeriert werden. Deshalb stelle ich nun die Konzepte für die drei bekannten Systeme vor.
CVS benutzt Revisionsnummern einzeln für jede Datei [PVC03, S.14-15]. Dies kann
am besten an einem Beispiel illustriert werden. Es existieren zwei Dateien mit den Versionsnummern:
Beispiel1.java
1.4
Beispiel2.java
1.6
Nun wird nur Datei Beispiel1.java geändert und ins Repository übertragen. Die Revisionsnummer wird erhöht, allerdings nur die von Beispiel1.java:
Beispiel1.java
1.5
Beispiel2.java
1.6
Dies hat zur Folge, dass die Revisionsnummern keinen Aufschluss darüber geben, ob
und in welchem Release des Softwareprojektes, also welcher Version, sie genutzt werden. Sie sind rein auf die Datei - Änderungen bezogen. Release 5 bedeutet also nicht,
-16-
3.2.4 Versionen, Revisionen
dass die Dateien mit den Nummern *.5 in diesem Release benutzt werden, es könnten
auch Dateien *.9 oder ähnliches sein. Es ist also an der Nummer eines Releases nicht zu
erkennen, welche Dateirevisionen in ihr verwendet werden. Zu diesem Zweck existieren
Tags, die im nächsten Kapitel angesprochen werden.
Trotzdem lässt diese Art der Nummerierung einige Rückschlüsse zu. Da das Änderungsdatum gespeichert ist, lassen sich zum Beispiel Änderungen in einem bestimmten
Zeitraum, z.B. einem Monat, erkennen. Natürlich können auch ältere Revisionen einer
Datei wiederhergestellt oder Änderungen zwischen zwei Revisionen einer Datei angezeigt werden.
Bei Subversion sieht das Prinzip etwas anders aus. Hier werden Revisionsnummern
global für das Repository vergeben, und nicht fortlaufend für eine Datei [SUVCS05,
Kap. 1.3.2]. Dies kann wieder an einem Beispiel gezeigt werden. Es existieren wieder
die beiden Dateien mit ihren Revisionsnummern:
Beispiel1.java
1.2
Beispiel2.java
1.2
In Subversion impliziert dies nun, dass genau diese Dateirevisionen in Release 2 benutzt
werden. Wird nun nur Datei Beispiel1.java geändert, werden alle Änderungsnummern
aller Dateien im Projekt geändert:
Beispiel1.java
1.3
Beispiel2.java
1.3
Dies geschieht, obwohl nur Beispiel1.java verändert wurde.
Eine Folge dieser globalen Änderungsnummern ist die schnell wachsende Zahl der
Nummern, da jedes commit eine Inkrementierung der Nummern zur Folge hat. Der
Vorteil besteht aber in der besseren Struktur. Es müssen nicht zusätzliche Befehle wie
in CVS ausgeführt werden, um ein Release zu kennzeichnen.
Ein Nachteil ist die Tatsache, dass die Anzahl an Änderungen einer Datei nicht so einfach nachzuvollziehen ist wie in Datei - basierten Systemen wie CVS, da die Änderungsnummer nicht zwingend eine Modifikation bedeutet.
Auch ClearCase vergibt Änderungsnummern. Welchem Prinzip die Software folgt,
wurde aus der Literatur und ohne praktischen Test leider nicht ersichtlich.
3.2.5 Tags
Wie in Kapitel 3.2.5 beschrieben, sagen Revisionsnummern nicht zwingend etwas über
-17-
3.2.5 Tags
die Verwendung in einer Softwareversion aus. In CVS ist dies der Fall. Versionsverwaltungssysteme bieten eine weitere Funktionalität, die sich tagging nennt und dieses Problem behebt.
Mittels dieser Funktion können Elemente des Repositories markiert und so einem bestimmten Release der Software zugeordnet werden. Möchte ich also für ein Release
kennzeichnen, welche Dateirevisionen in diesem benutzt werden, führe ich den Befehl
„tag“ aus, und ich erhalte eine eindeutige Kennzeichnung. Vor allem für Systeme wie
CVS, die dateibezogen Revisionsnummern vergeben ist dies von Vorteil. Ich kann nun
eine Markierung mit dem Namen „Release 2“ erstellen und dieser Dateien mit verschiedenen Revisionsnummern zuordnen. Benutzt wird diese Funktion vor allem an Meilensteinen in einem Projekt. Zudem ist ein großer Vorteil, dass so ältere lauffähige Versionen der Software wiederhergestellt werden können, wenn eine neuere Version zu viele
Fehler aufweist [PVC03, Kap. 2.6].
In CVS ist dies einfach zu realisieren. Entwickler A möchte nun die Dateien in seinem
Arbeitsverzeichnis mittels eines Tags markieren. Es sollen also die Revisionen der
Dateien markiert werden, die zu diesem Zeitpunkt das Release darstellen. Dies
geschieht mit dem einfachen Befehl:
C:\work\Lala> cvs –d C:\sandbox tag Rel_1
Unter der Annahme, dass wieder die schon betrachteten Dateien Farben.txt und Zahlen.txt betrachtet werden, antwortet CVS:
cvs tag: Tagging .
T Farben.txt
T Zahlen.txt
Die Dateien sind nun markiert mit dem Namen Rel_1. Es ist nun möglich, genau diese
Revisionen der Dateien zu einem späteren Zeitpunkt wiederherzustellen, bzw. genauer
gesagt, das entsprechende Release ist reproduzierbar.
Dies ist aber nur ein kleiner Teil der Möglichkeiten, die CVS bietet. Neben dem dem
Befehl tag, existiert auch noch der Befehl rtag (releasetag), der aber eine Synchronisation mit dem Repository voraussetzt. Genauere Informationen würden hier den Rahmen
der Arbeit sprengen, können aber nachgelesen werden [PVC03, Kap. 7.1].
In Subversion sieht dies zwar ähnlich aus, hat aber einen anderen Hintergrund. Wie in
Kapitel 3.2.5 schon beschrieben, sind ja schon die Revisionsnummern kennzeichnend
für eine Version der Software. Ein Tag macht hier nichts anderes, nur eine eigene Namensgebung ist möglich. Technisch gesehen, bildet Subversion ein neues Verzeichnis
-18-
3.2.5 Tags
im Repository mit dem Namen des Tags [VCSUB04, S. 56]. Dies alles geschieht mit
dem Befehl „copy“:
C:\work> svn copy file:///c:/Pfad/zum/Repository
file:///c:/Pfad/zum/Repository/tags/release_1_1
Gespeichert wird das Tag in einem Ordner „tags“ im Repository.
In ClearCase nennen sich tags nun Labels, stellen aber die gleiche Funktionalität, also
das Markieren von Revisionen von Dateien dar [ACCD04, Kap. 12.2].
3.2.6 Branching
Diese Funktionalität erlaubt den Benutzern auf mehreren Entwicklungszweigen zu arbeiten [PVC03, Kap. 2.7]. Damit ist folgendes gemeint. Im normalen Fall arbeiten alle
Entwickler in einem Projekt an dem gleichen Code, der „mainline“ des Projektes. Zu
einem bestimmten Zeitpunkt soll nun ein Release an die Öffentlichkeit gehen. Das Entwicklerteam teilt sich hierfür auf. Der eine Teil ist nun für die Erstellung eines lauffähigen Releases zuständig, der andere Teil soll den Code, wie vorher, weiter entwickeln.
Extrem wichtig für das Release-Team ist nun natürlich, dass der Code stabil bleibt, also
keine großen Änderungen mehr auftreten, da sonst eventuell keine lauffähige Version
zu Stande kommen kann. Aber wie funktioniert das? Der Rest des Teams kann nicht
einfach aufhören zu arbeiten, nur weil der Code in der „mainline“ nicht mehr verändert
werden soll. Die Lösung ist die Abkopplung des Codes in einen weiteren Entwicklungszweig. Zu einem bestimmten Zeitpunkt wird der komplette Code in einen neuen Entwicklungszweig kopiert, an dem nun nur noch das Release-Team arbeitet. Der Rest der
Entwickler führt seine Arbeit weiter am Code in der „mainline“ durch, so dass parallel
gearbeitet werden kann.
Auch Fehler die in dem veröffentlichten Release gefunden werden, korrigiert die Release-Gruppe nur in ihrem Zweig, nicht in der „mainline“.
Eine Frage ist natürlich, was passiert, wenn erkannt wird, dass Fehler in dem Release
auch in der „mainline“ vorhanden sind? Zu diesem Zweck bietet das Versionsverwaltungssystem die Funktionalität des Zusammenfügens. Eine Datei in dem Entwicklungszweig Release kann mit einer aus der „mainline“ verglichen werden und die Unterschiede in der „mainline“ korrigiert werden.
Branching ermöglicht also eine unabhängige, parallele Bearbeitung des Codes für verschiedene Zwecke.
-19-
3.2.6 Branching
In CVS wird Branching mittels des tag-Befehls realisiert. Wenn Entwickler B einen
neuen Zweig neben der mainline eröffnen möchte, tut er dies folgendermaßen:
C:\work2\Lala> cvs –d C:\sandbox tag –b Branch_1
Antwort von CVS:
cvs tag: Tagging .
T Farben.txt
T Zahlen.txt
Die Antwort ist also identisch mit der aus Kapitel 3, das eigentliche Ergebnis aber ein
anderes. Es existiert nun ein weiterer Entwicklungszweig Branch_1 in dem Projekt, auf
dem separat Dateien bearbeitet werden können. Zusammengefügt werden die Entwicklungszweige dann mit dem Befehl „update –j“. Dies führt hier zum Beispiel Entwickler
A aus, unter der Annahme, dass Entwickler B die Datei Zahlen.txt geändert hatte:
C:\work\Lala> cvs –d C:\sandbox update –j Branche_1
Antwort von CVS:
cvs update: Updating .
RCS file: C:\sandbox/Lala/Zahlen.txt,v
retrieving revision 1.2
retrieving revision 1.2.2.1
Merging differences between 1.2 and 1.2.2.1 into
Zahlen.txt
cvs update: Updating Lala
Nun sind die Entwicklungszweige wieder zusammengefügt und aktuell.
In Subversion ist die Syntax zur Erstellung eines neuen Entwicklungszweiges analog
zur Erstellung eines Tags. Lediglich das Ziel befindet sich nun nicht im Ordner „tags“,
sondern im Ordner „branches“ [VCSUB04, S. 42].
Natürlich bietet auch ClearCase das Prinzip mehrerer Entwicklungszweige an. Die Erstellung kann wie schon bei den vorherigen Funktionen über den ClearCase Explorer
geschehen. Weiterhin ist es in ClearCase natürlich auch möglich, verschiedene Entwicklungszweige wieder zu einem Zweig zusammen zu fügen.
-20-
4 Zusammenfassung und Ausblick
4 Zusammenfassung und Ausblick
In Laufe dieser Arbeit bin ich auf die Grundfunktionen von Versionsverwaltungssystemen eingegangen. Zum einen wurde beschrieben, wie Anforderungen an ein solches
System aussehen und wie diese theoretisch umgesetzt werden können. Eine wichtige
Rolle spielte hier die Änderungsverwaltung und das verteilte Arbeiten.
Weiterhin wurden die grundsätzlichen Arbeitsweisen der drei vorgestellten Werkzeuge
beschrieben, um einen kleinen Einblick in das praktische Arbeiten zu geben.
Es muss aber gesagt werden, dass dies zum einen nur einen kleinen Einblick in die Versionsverwaltung sein kann und zum anderen die Werkzeuge deutlich mehr Funktionalität aufweisen, als in dieser Arbeit dargestellt werden konnte.
Diese Systeme sind in der Lage, Unterschiede zwischen Revisionen von Dateien, zwischen Versionen der Software oder mehreren Entwicklungszweigen darzustellen und zu
analysieren. Auch wurden in der Arbeit nicht die Zugriffsmechanismen auf das Repository detailliert beschrieben.
Als letztes muss auch gesagt werden, dass neben den beschriebenen Werkzeugen viele
andere auf dem Markt erhältlich sind, so dass es sich bei CVS, Subversion und ClearCase zwar um bekannte Vertreter handelt, diese aber keineswegs ausschließlich benutzt
werden.
Zusammenfassend kann man sagen, dass diese Seminararbeit nur eine Einführung in die
Versionsverwaltung und deren Werkzeuge darstellen kann und die gesamte Komplexität
nur im Ansatz darstellt.
-21-
Literaturverzeichnis
Literaturverzeichnis:
[IBM03]
IBM Rational Software, Working in ClearCase for Windows, 2003
[CC04]
Ueli Wali, Jenni Brown, Matti Teinonen, Trulsson: Software
Configuration Management – A Clear Case for IBM Rational ClearCase
and ClearQuest UCM, ibm.com/redbooks, 2004
[SCM05]
David E. Bellagio, Tom J. Milligan: Software Configuration Management Strategies and IBM Rational ClearCase – Second Edition – Practical Introduction
[EsCVS03]
Jennifer Vespermann: Essential CVS, O`Reilly, 2003
[PVC03]
David Thomas, Andrew Hunt: Pragmatic Version Control with CVS, The
Pragmatic Programmers, 2003
[OSD03]
Moshe Bar, Karl Fogel: Open Source Development with CVS, Paragraph
Press, 2003
[VCSUB04] Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato: Version
Control with Subversion, O`Reilly, 2004
[SUVCS05]
William Nagel: Subversion Version Control: Using the Subversion
Version Control System in Development, Prentice Hall, 2005
[WIKIS]
wikipedia: Subversion (Software),
http://de.wikipedia.org/wiki/subversion(software)
[ACCD04]
Christian P. Buckley, Darren W. Pulsipher: The Art of ClearCase
Deployment – The Secret to successful Implementation, Addison Wesley,
2004