Das Revision Control System (RCS) verwaltet Dateien, die häufigen Änderungen unterworfen sind. Es erleichtert Ihnen die Kontrolle über Ihre Schreib- und Programmierprojekte durch automatisierte Versionsnummern, Logfiles und Textvergleiche.
Wenn Sie viel und gern mit Ihrem freien Betriebssystem arbeiten, sammeln sich schnell zahlreiche Skripte an, die tagtägliche Aufgaben routiniert erledigen: Vom Perl-Schnipsel, das allmorgentlich den neuesten Online-Comic aus dem Netz zieht, bis hin zu ein paar Shell-Zeilen [1], die auf die Sekunde genau eine Sicherungskopie der Daten erstellen.
Damit Sie den Überblick im Text-Dschungel der selbst geschriebenen Tools behalten, bietet sich ein Versionsmanagement an. Das bedeutet für Sie nicht zwangsläufig den Einstieg in die ebenso bekannten wie komplexen Programme CVS [2] oder Subversion [3]. Etwas abseits der ausgetretenen Pfade erledigt der Oldtimer RCS die Aufgabe genauso gewissenhaft und unkompliziert.
Falls das Revision Control System nicht Teil der von Ihnen genutzten Distribution ist, erhalten Sie es von der GNU-Projektseite [4] im Internet oder direkt von dessen offizieller Homepage [5]. Hinweise zur Installation aus dem Quelltext [6], auf die der Artikel aus Platzgründen nicht eingeht, finden Sie in den Dateien INSTALL und INSTALL.RCS im entpackten Tarball rcs-5.7.tar.Z.
Vorbereitung
Wie sieht dieses Versionsmanagement praktisch aus? Im Grunde gleicht die Arbeit mit dem RCS einem Flughafen-Terminal: Auf dem Weg zu Ihrer Gangway müssen Sie sich ein- und auschecken. Auf ähnliche Weise funktioniert auch das Revision Control System in Bezug auf Dateien. Ein ausführlicher Artikel zu den Grundlagen des Versionsmanagements im Schwerpunkt dieser Ausgabe erläutert die Details.
Nehmen wir an, Sie möchten die selbst geschriebenen Skripte im Verzeichnis ~/bin verwalten, dann erstellen Sie zunächst mit dem Befehl mkdir ~/bin/RCS das RCS-Arbeitsverzeichnis. In dieses sogenannte Repository (dt. Aufbewahrungsort) legt RCS die Revisionsdatei, die den Namen des zu verwaltenden Files trägt, plus eine Endung mit der Zeichenfolge ,v.
Es handelt sich dabei um das Original-File, das – mit einigen zusätzlichen Angaben versehen – von jetzt an immer im RCS-Verzeichnis bleibt. Nehmen Sie Änderungen an der Datei vor oder brauchen Sie eine Version zum Arbeiten, dann tun Sie dies immer mit einer Kopie.
Im nächsten Schritt schreiben Sie ein Beispiel-Skript, das es zu kontrollieren gilt, und mit dem Sie nach Herzenslust experimentieren, ohne Ihren Datenbestand zu gefährden. Um auf der Kommandozeile zu bleiben, nehmen Sie dafür einfach den Befehl Cat. Damit erstellen Sie das Skript in einem sogenannten Here-Dokument.
[akneib]~ > cat > ~/bin/wel?t.sh <<__EOF__#!/bin/shecho "Hallo Welt!"__EOF__
Ein- und Auschecken
Damit sich das Revision Control System der Beispieldatei annimmt, übergeben Sie sie an das Programm. Dies passiert mit dem Befehl ci (check in). Nach der Eingabe des Kommandos fordert Sie das Versionsmanagement auf, die Datei zu beschreiben oder eine Arbeitsnotiz zu verfassen. Die Beschreibung beenden Sie mit einem Punkt in einer alleinstehenden Zeile. Das Einchecken ist nun abgeschlossen und das RCS quittiert Ihre Notiz mit einem Hinweis auf die Version 1.1, die es dem Beispiel-Skript zuteilt:
[akneib]~/bin > ci welt.sh RCS/welt.sh,v <-- welt.sh enter description, terminated wi? th single '.' or end of file: NOTE: This is NOT the log messag? e! >> Beschreibung zur Datei >> . initial revision: 1.1 done
Wie Ihnen der Befehl ls ~/bin verrät, ist die Datei welt.sh jetzt aus dem Verzeichnis verschwunden. Sie liegt nun in umgewandelter Form im Pfad ~/bin/RCS/welt.sh,v als Revisionsdatei vor (Listing 1).
Listing 1
head 1.1; access; symbols; locks; strict; comment @# @; 1.1 date 2006.02.01.14.16.10; author akneib; state Exp; branches; next ; desc @Beschreibung zur Datei @ 1.1 log @Initial revision @ text @#!/bin/sh echo "Hallo Welt!" @
Dieses Verhalten ist nicht in jedem Fall erwünscht, da nun das Skript aus dem Pfad entfernt wurde und nicht mehr funktioniert. Entweder checken Sie die Datei also einfach wieder aus, oder verwenden bei Check in die Option -u (unlocked). Der Befehl ci -u welt.sh bewirkt, dass direkt nach dem Einchecken eine nicht editierbare Kopie im Verzeichnis ~/bin landet.
Wollen Sie den Kommentar nicht immer interaktiv angeben, so setzen Sie ihn einfach in Anführungszeichen direkt an die Option -m beim Einchecken der Datei. Der Befehl co -u -m"<§§I>Beschreibung<§§I>" welt.sh checkt also die Datei ein, fügt automatisch den Kommentar hinzu und checkt gleicht eine nur lesbare Kopie wieder aus.
Durch den Parameter -u steht die Datei nicht mehr beim RCS im Lock, dass heißt, sie ist nicht mehr gesperrt, falls mehrere Benutzer an einer Datei arbeiten. Ein Versionskontrollsystem erlaubt nämlich nicht nur das Rückverfolgen von Änderungen an einer Datei, es stellt auch sicher, dass sich die Modifikationen von zwei Benutzern nicht ins Gehege kommen.
Möchten Sie das Skript im Editor öffnen, um etwas zu ändern, checken Sie es mit der Option -l (locked) aus und sperren es so vor dem Zugriff durch weitere User, die eventuell Zugriff auf das File haben. Dies erreichen Sie mit dem folgenden Befehl:
[akneib]~/bin > co -l welt.sh RCS/welt.sh,v --> welt.sh revision 1.1 (locked) done
In der Tat ist die Datei welt.sh jetzt ausschließlich für Sie beschreibbar, wie der Befehl ls -l welt.sh Ihnen zeigt.
Als nächstes öffnen Sie das Script in Ihrem Lieblings-Editor und fügen eine Kommentarzeile ein. In unserem Beispiel nehmen wir den interaktiven Editor Ed. Er steht heute auf vielen System als Variante des bekannteren Vim zur Verfügung. Der Umgang mit ihm mag erst ungewohnt erscheinen, aber für schnelle Änderungen an einem Text-File eignet er sich wunderbar.
[akneib]~/bin > ed welt.sh 28. echo "hallo welt"i# Dies ist eine Kommentarzeile.wq 59
Am Anfang sowie am Ende gibt das Tool die Anzahl der Zeichen in dieser Datei aus. Der Punkt weist Ed an, die aktuelle Zeile auszugeben. Er beendet aber auch die Eingabe, die Sie mit der Taste [I] starten. Nach dieser Modifikation checken Sie die Datei wieder ein. Dabei bittet RCS Sie um eine Notiz über die gerade erfolgten Änderungen in der Datei. Die Notiz schließen Sie, wie zuvor, mit einem einzelnen Punkt in einer Zeile ab.
[akneib]~/bin > ci -u welt.sh RCS/welt.sh,v <-- welt.sh new revision: 1.2; previous revi? sion: 1.1 enter log message, terminated wi? th single '.' or end of file: >> Kommentarzeile erstellt >> . done
Auf diese Weise erzeugen Sie aus der Version 1.1 der Datei welt.sh die Version 1.2. Vielleicht gefällt Ihnen aber die neue Version nicht, und Sie möchten erneut auf die Revisionsnummer 1.1 Ihres Skriptes zurückgreifen? Für solche Aufgaben dient die Option -r des Checkout-Befehls. Sie legt die Revision fest, die es herzustellen gilt:
[akneib]~/bin > co -r1.1 welt.sh RCS/welt.sh,v --> welt.sh revision 1.1 done
Wie Ihnen der Befehl Cat zeigt, steht das Skript nun wieder in seiner ursprünglichen Version ohne Kommentarzeile bereit:
[akneib]~/bin > cat welt.sh #!/bin/sh echo "Hallo Welt!"
Mit dem Kommando co -r1.2 welt.sh zaubern Sie erneut Version 1.2 aus dem Repository hervor.
Versionen
Doch wo bleibt bei all dem Ein- und Auschecken die Versionskontrolle? Sie verbirgt sich hinter den Befehlen Rlog und Rcsdiff. Mit dem Kommando rlog welt.sh zeigt Ihnen das Programm Einzelheiten wie die Dateibeschreibung (description) und den Autor der verschiedenen Revisionen (author) samt den dazugehörigen Arbeitsnotizen (Listing 2).
Listing 2
RCS file: RCS/welt.sh,v Working file: welt.sh head: 1.2 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 2; selected revisions: 2 description: Beschreibung zur Datei —————————- revision 1.2 date: 2006/02/06 07:38:50; author: akneib; state: Exp; lines: +1 -0 Kommentarzeile erstellt —————————- revision 1.1 date: 2006/02/01 14:16:10; author: akneib; state: Exp; Initial revision =============================================================================
Welche genauen Unterschiede es zwischen den Versionen 1.1 und 1.2 Ihres Skriptes gibt, ermittelt das Tool Rcsdiff. Die Option -r definiert, wie schon beim Kommando co, die Revisionsnummern, zwischen denen Rcsdiff vergleicht.
[akneib]~/bin > rcsdiff -r1.1 -r?1.2 welt.sh ========================== RCS file: RCS/welt.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 1a2 > # Dies ist eine Kommentarzeile
Darüber hinaus versteht das RCS eine Reihe von Variablen. Eine der meistverwendeten versieht die Datei mit Abgaben zu Autor und Status. Zunächst checken Sie die Datei aus mit dem bereits bekannten Befehl co -l welt.sh. Dann ändern Sie die Zeile # Dies ist eine Kommentarzeile um, so dass darin die RCS-Variable $Id$ nach dem Hash steht. Der Einfachheit halber kommt hier wieder der Editor Ed zum Einsatz:
[akneib]~/bin > ed welt.sh 592 # Dies ist eine Kommentarzeilec# $Id$.wq 35
Nach dem Speichern der Datei checken Sie sie mittels ci -u welt.sh wieder ein. Ein Blick auf das Skript verrät Ihnen, dass das Versionsmanagement die Variable $Id$ expandiert hat:
[akneib]~/bin > cat welt.sh #!/bin/sh # $Id: welt.sh,v 1.3 2006/02/06 ? 10:05:59 akneib Exp $ echo "Hallo Welt!"
Die Zeile gibt Ihnen Informationen wie den Dateinamen, die Revisionsnummer, das Datum samt Uhrzeit und den Autor. Den Inhalt weiterer Variablen, mit denen Sie Ihr Skript ergänzen können, erfahren Sie über die Manual-Seite von Check out, die Sie mit dem Kommando man co öffnen.
Fazit
Zum Verwalten kleiner Skripte oder Konfigurationsdateien leistet RCS gute Dienste, da es mit einer Hand voll Befehle selbst für Einsteiger leicht bedienbar ist. Mit dem Revision Control System sind Sie immer auf der sicheren Seite, wenn es um kniffelige Änderungen am System geht, denn es erlaubt bei konsequentem Einsatz, ein leichtes rückgängig machen aller Schritte.
Glossar
-
Here-Dokument
-
Bei einem Here-Dokument nutzen Sie eine besondere Form der Ausgabeumleitung, um einen längeren Textblock aus einem Codeblock heraus zu schreiben.
Infos
[1] (Un)geliebte Shell, Linuxuser 06/2000, S. 92, K. Günther und B. Rohwer http://www.linux-user.de/ausgabe/2000/06/092-shells/092-shells.html
[2] Teamwork, LinuxUser 08/2001, S. 46, Patricia Jung: http://www.linux-user.de/ausgabe/2001/08/046-answergirl/answergirl.html
[3] Subversion-Projektseite: http://subversion.tigris.org
[4] GNU-RCS-Projektseite: http://www.gnu.org/software/rcs/rcs.html
[5] RCS-Homepage: http://www.cs.purdue.edu/homes/trinkle/RCS/
[6] Auf zu den Quellen, LinuxUser 07/2005, S. 86, Andreas Kneib: http://www.linux-user.de/ausgabe/2005/07/086-kompilieren/




