Beruflich Dokumente
Kultur Dokumente
Bölz
CVS
Eine Einführung
bölzebub.de
2
Inhaltsverzeichnis
Vorwort 5
1 Einleitung 7
1.1 Geschichte . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Beschaffung & Installation . . . . . . . . . . . . . . . . . . 9
1.5 Aufruf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6 Zugriff auf ein Archiv . . . . . . . . . . . . . . . . . . . . 10
1.7 Vorbereitungen . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Archiv anlegen 13
4 Arbeitskopie auschecken 17
5 Veränderungen einbringen 19
6 Arbeitskopie aktualisieren 21
7 Konflikte 23
9 Log-Nachrichten lesen 27
3
Inhaltsverzeichnis
10 Vergleiche 29
12 Marken 35
13 Verzweigungen 39
13.1 Projekt verzweigen . . . . . . . . . . . . . . . . . . . . . . 40
13.2 Zweige verschmelzen . . . . . . . . . . . . . . . . . . . . . 42
Anhang 47
A Befehle 47
B Literatur 49
4
Vorwort
Wer programmiert kennt das Problem: Gestern lief das Programm noch,
heute läuft es nicht mehr. Deshalb ist es wichtig, die Veränderungen
nachvollziehen zu können. Um nicht jede Änderung selbst speichern zu
müssen, gibt es Versionskontrollsysteme. Das wahrscheinlich am weites-
ten verbreitete ist das CVS – das Concurrent Versions System.
Das CVS kann natürlich viel mehr, als auf diesen nicht ganz 50 Seiten
beschrieben werden kann. Dies soll – wie der Titel schon sagt – auch nur
eine Einführung sein.
1 Für alle anderen: Die main()-Funktion wird beim starten des Programms aus-
5
Vorwort
6
Kapitel 1
Einleitung
1.1 Geschichte
CVS basiert grundlegend auf dem Standard-Unix-Programm diff, ei-
nem Programm zum vergleichen zweier Dateien, und dessen Erweiterung
patch von Larry Wall. Wird patch eine Datei mit den Änderungen, ein
sogenannter Patch, übergeben, fügt es die Änderungen in die entspre-
chenden Dateien ein.
1 System konkurrierender Versionen
7
Einleitung
Auf diese Programmen baute auch schon das Revision Control Sys-
tem RCS von Walter Tichys auf. Dieses Versionskontrollsystem hatte
jedoch einige Nachteile, z. B. musste eine Datei erst gesperrt werden,
bevor man sie bearbeiten konnte. Es war also nicht möglich, dass zwei
Entwickler gleichzeitig an einer Datei arbeiten.
Deshalb wurde das CVS geschrieben. Die erste Version war eine
Sammlung von Shell-Skripten von Dick Grune, die das RCS so aufrief,
dass viele Probleme umgangen wurden. 1989 schrieben Brian Berliner
und Jeff Polk das CVS in der Programmiersprache C neu. Später erwei-
terte Jim Kingdon es um die Netzwerkfähigkeit.
1.2 Konventionen
Dateien, Internetadressen, etc. werden kursiv geschrieben.
Als Shell kommt die bash zum Einsatz. Deshalb werden auch alle
Umgebungsvariablen mit einem $ gekennzeichnet, z.B. $CVSROOT.
1.3 Terminologie
Am Anfang sollten noch ein paar Begriffe geklärt werden:
8
1.4 Beschaffung & Installation
Archiv (repository) Das Verzeichnis, in dem das CVS zentral das Pro-
jekt mit allen Veränderungen speichert.
Arbeitskopie Die (lokale) Kopie, mit der der Entwickler arbeitet. Nur
an ihr werden direkt Veränderungen vorgenommen, die dann ins
Archiv übernommen werden.
Revision Die Revisionsnummer wird vom CVS intern verwendet. Sie
bezieht sich auf eine einzelne Datei, nicht auf das gesamte Pro-
gramm, und wird bei jeder Veränderung erhöht.
1.5 Aufruf
Der Aufruf des CVS sieht folgendermaßen aus:
cvs [globale Optionen] Befehl [Befehlsoptionen] [Dateien]
Das CVS kann viele verschiedene Operation durchführen. Für sie gibt
es jeweils einen Befehl. Außerdem können noch globale Optionen, die
für alle Befehle gelten, und Befehlsoptionen, die vom jeweiligen Befehl
abhängig sind, angegeben werden. Desshalb ist z. B. cvs -d /usr/local/
archiv checkout nicht dasselbe wie cvs checkout -d /usr/local/archiv.
Manche Befehle benötigen noch (eine) Datei(en) als Argument. Diese
werden/wird als letztes übergeben.
Für die meisten Befehle gibt es Alternativen, hauptsächlich Kurzfor-
men und die Namen der Befehle des RCS (siehe Anhang A).
9
Einleitung
1.7 Vorbereitungen
Umgebungsvariablen
Wer immer auf dasselbe Archiv zugreifen will, sollte $CVSROOT setzen.
Daduch wird die Angabe des Archivs mit -d überflüssig.
In einer der Variablen $CVSEDITOR, $VISUAL oder $EDITOR soll-
te der bevorzugte Editor stehen, sonst wird vi verwendet.
Soll auf ein Archiv mit der ext-Methode zugegriffen werden, muss
auch $CVS RSH gesetzt sein, wenn nicht die rsh genutzt werden soll.
Unter Windows muss noch entweder $HOME oder $HOMEDRIVE
und $HOMEPATH gesetzt sein, da im entsprechenden Verzeichnis die
benutzerspezifischen Konfigurationsdateien gespeichert werden.
2 für directory (Verzeichnis)
10
1.7 Vorbereitungen
Zu ignorierende Dateien
Wer programmiert testet seine Veränderungen auch hin und wieder. Das
ausführbare Programm, die Objektdateien, etc. sollten jedoch nicht in
das Archiv übernommen werden. Das CVS lässt sich so einstellen, das
es diese Dateien und Dateitypen ignoriert.
Dazu gibt es drei Möglichkeiten:
• Für alle Benutzer: Die Datei cvsignore im /etc-Verzeichnis
• Die Datei .cvsignore im Heimatverzeichnis
11
Einleitung
12
Kapitel 2
Archiv anlegen
Um das CVS nutzen zu können, muss ein Archiv vorhanden sein. Ein
lokales Archiv kann man mit
cvs init
angelegen. Der Ordner, in dem es angelegt werden soll, wird mit der
globalen Option -d angegeben. Für das entsprechende Verzeichnis muss
man Schreibrechte haben.
Beispiel:
13
Archiv anlegen
In der ersten Zeile wird das Archiv angelegt. Das ganze wird als root
ausgeführt (sudo), da Schreibberechtigung vorliegen muss.
Im entsprechenden Verzeichnis wird der Ordner CVSROOT ange-
legt. Darin werden die Konfigurationsdateien des Archivs gespeichert.
14
Kapitel 3
15
Neues Projekt beginnen
Beispiel:
[tmb@fuckupII tmb]$ export CVSROOT=/usr/local/archiv
[tmb@fuckupII tmb]$ cd meinprojekt/
[tmb@fuckupII meinprojekt]$ ls
hallo.c readme sinnlos.h unterverzeichnis/
[tmb@fuckupII meinprojekt]$ cat hallo.c
#include <stdio.h>
int main(void)
{
printf("Hallo, Welt!\n");
return 0;
}
[tmb@fuckupII tmb]$ cvs import -m "erster Import"
hallo tmb start
N meinprojekt/hallo.c
N meinprojekt/readme
N meinprojekt/sinnlos.h
cvs import: Importing
/usr/local/archiv/meinprojekt/unterverzeichnis
N meinprojekt/unterverzeichnis/blabla.c
[tmb@fuckupII tmb]$
Als erstes wird $CVSROOT auf das vorher angelegte Archiv gesetzt.
Das Beispielprojekt befindet sich im Ordner meinprojekt. Das eigentli-
che Programm ist hallo.c. Das Projekt wird unter dem Namen hallo in
das Archiv importiert.
Man kann jetzt jedoch nicht mit den ursprünglichen Dateien weiter-
arbeiten. Es muss erst eine Arbeitskopie angelegt werden.
16
Kapitel 4
Arbeitskopie auschecken
an. Dabei wird im aktuellen Verzeichnis ein Ordner mit dem Namen des
Projekts angelegt. Ist $CVSROOT nicht gesetzt oder soll ein anderes
Archiv verwendet werden, muss die -d-Option verwendet werden.
Beispiel:
17
Arbeitskopie auschecken
CVS erstellt. Darin speichert das CVS Informationen über die einzelnen
Dateien und das Archiv, in dem das Projekt verwaltet wird.
18
Kapitel 5
Veränderungen
einbringen
Beispiel:
[tmb@fuckupII hallo]$ vi hallo.c
[. . . ]
int main(void)
{
printf("Hallo, Welt!\n");
printf("tschuess!\n");
return 0;
}
19
Veränderungen einbringen
Die Datei hallo.c wurde verändert. Nach Hallo, Welt! wird jetzt noch
tschuess! ausgegeben.
Vor dem Commit wird wird cvs update ausgeführt (siehe Kapitel
6: Arbeitskopie aktualisieren). Dabei wird überprüft, ob es im Archiv
evtl. eine neuere Revision einer Datei gibt. Dann kann das Commit nicht
durchgeführt werden. Wer das CVS nur allein verwendet, kann auf diesen
Schritt verzichten.
Beim Commit untersucht das CVS als erstes die Arbeitskopie auf
veränderte Dateien. Diese werden dann in das Archiv übernommen, die
Revisionen der entsprechenden Dateien werden erhöht.
20
Kapitel 6
Arbeitskopie
aktualisieren
Beispiel 1:
[tmb@fuckupII hallo]$ cvs update
cvs update: Updating .
U hallo.c
cvs update: Updating unterverzeichnis
[tmb@fuckupII hallo]$
Die Datei hallo.c wurde von einem anderen Entwickler verändert. Die
Veränderungen wurden in die Arbeitskopie übernommen (Das U vor
hallo.c steht für update).
21
Arbeitskopie aktualisieren
Beispiel 2:
[tmb@fuckupII hallo]$ cvs update
cvs update: Updating .
M hallo.c
cvs update: Updating unterverzeichnis
[tmb@fuckupII hallo]$
Hier gibt es keine neueren Revisionen im Archiv, das M1 vor hal-
lo.c sagt jedoch aus, dass diese Datei von einem selbst verändert wurde.
22
Kapitel 7
Konflikte
Zu einem Konflikt kommt es bei einem Update, wenn man in der Arbeits-
kopie an einer Stelle etwas verändert, die inzwichen schon von jemand
anderem verändert und per Commit ins Archiv übernommen wurde.
Beispiel:
Beim Update von hallo.c trat ein Konflikt auf. Doch das CVS zeigt
dies nicht nur an, sondern fügt nun auch beide Veränderungen in folgen-
der Form in die Datei ein:
[. . . ]
<<<<<<< Dateiname
Eigene Veränderung
=======
23
Konflikte
Veränderung im Archiv
>>>>>>> Revision
[. . . ]
Jetzt sollte man den Konflikt beheben und danach die konflikfreie
Version per Commit ins Archiv übernehmen. Dabei sollte man sich aber
auf jeden Fall mit dem anderen Entwickler absprechen und nicht einfach
die eigene Änderung übernehmen, sonst arbeitet dieser (oder Sie) ganz
schnell an einem anderen Projekt.
24
Kapitel 8
anzeigen. Wenn keine Datei angegeben wird, wird der Status jeder Datei
des Projekts angezeigt.
Beispiel:
[tmb@fuckupII hallo]$
Die Datei ist hier also Up-to-date, d. h. sie entspricht der im Archiv.
Es können aber auch andere Statuse auftreten:
25
Status der Arbeitskopie
1 Haftende Marke
2 Haftendes Datum
26
Kapitel 9
Log-Nachrichten lesen
Wenn keine Datei angegeben wird, werden auch hier alle Dateien bear-
beitet.
Beispiel:
27
Log-Nachrichten lesen
revision 1.3
date: 2003/03/24 13:44:53; author: tmb; state: Exp;
lines: +1 -1
weitere verbesserung
----------------------------
revision 1.2
date: 2003/03/24 13:36:09; author: tmb; state: Exp;
lines: +1 -0
massive erweiterung
----------------------------
revision 1.1
date: 2003/03/24 13:30:11; author: tmb; state: Exp;
branches: 1.1.1;
Initial revision
----------------------------
revision 1.1.1.1
date: 2003/03/24 13:30:11; author: tmb; state: Exp;
lines: +0 -0
Erster import des grandiosen Hallo-Welt-Programms
========================================================
[tmb@fuckupII hallo]$
Neben den eingegebenen Nachrichten zeigt cvs log auch das Da-
tum und den Autor der Veränderung. Die Angaben hinter lines: geben
Aufschluss darüber, wie viel verändert wurde.
28
Kapitel 10
Vergleiche
1 für context
29
Vergleiche
Beispiel:
[tmb@fuckupII hallo]$ cvs diff hallo.c
Index: hallo.c
========================================================
RCS file: /usr/local/archiv/hallo/hallo.c,v
retrieving revision 1.2
diff -r1.2 hallo.c
6c6
< printf("tschuess!");
---
> printf("Tschuess, Welt!");
[tmb@fuckupII hallo]$ cvs diff -c hallo.c
Index: hallo.c
========================================================
RCS file: /usr/local/archiv/hallo/hallo.c,v
retrieving revision 1.2
diff -c -r1.2 hallo.c
*** hallo.c 2003/03/24 13:36:09 1.2
--- hallo.c 2003/03/24 13:42:24
***************
*** 3,8 ****
int main(void)
{
printf("Hallo, Welt!\n");
! printf("tschuess!");
return 0;
}
--- 3,8 ----
int main(void)
{
printf("Hallo, Welt!\n");
! printf("Tschuess, Welt!");
return 0;
}
[tmb@fuckupII hallo]$
Vergleich von hallo.c mit der Basisrevision, oben ohne, unten mit
Kontext.
30
Kapitel 11
Dadurch wird aber nur in der Arbeitskopie vermerkt, dass die Datei zum
Projekt gehört. Um die Datei in das Archiv zu übernehmen, muss ein
commit durchgeführt werden.
Beispiel:
31
Dateien hinzufügen und entfernen
Checking in TODO;
/usr/local/archiv/hallo/TODO,v <-- TODO
initial revision: 1.1
done
[tmb@fuckupII hallo]$
Zuerst wird die Datei TODO erstellt. Mit cvs add wird sie zum Projekt
hinzugefügt und dann mit cvs commit in das Archiv übernommen.
Beispiel:
[tmb@fuckupII hallo]$ rm sinnlos.h
[tmb@fuckupII hallo]$ cvs remove sinnlos.h
cvs remove: scheduling ‘sinnlos.h’ for removal
cvs remove: use ’cvs commit’ to remove this file permanently
[tmb@fuckupII hallo]$ cvs commit -m "sinnlos.h geloescht"
cvs commit: Examining .
cvs commit: Examining unterverzeichnis
Removing sinnlos.h;
32
11.3 Dateien entfernen
33
Dateien hinzufügen und entfernen
34
Kapitel 12
Marken
35
Marken
Beispiel:
Der jetzige Stand des Projekts wurde mit der Marke version1 gekenn-
zeichnet.
Beispiel:
36
Sticky Date: (none)
Sticky Options: (none)
========================================================
File: hallo.c Status: Up-to-date
========================================================
[. . . ]
[tmb@fuckupII hallo]$
Hier wird ein Checkout mit der Marke version1 durchgeführt. Wie
cvs status anzeigt ist in der so neu angelegten Arbeitskopie versi-
on1 haftende Marke. Dies bedeutet, dass diese Arbeitskopie nicht ak-
tualisiert werden und man Veränderungen nicht ins Archiv übernehmen
kann.
37
Marken
38
Kapitel 13
Verzweigungen
Man kann mit dem CVS ein Projekt in mehrere Zweige spalten. Wird ein
Zweig verändert, betrifft dies den anderen nicht. Die einzelnen Zweige
können jedoch wieder verschmolzen, d. h. die Veränderungen des einen
in den anderen übernommen, werden.
Zweig -
Verschmelzung
? -
Hauptentwicklungslinie
39
Verzweigungen
eine neue Arbeitskopie an. Die Befehlsoption -d2 gibt dabei an, wo
diese erstellt wird.
Beispiel:
40
13.1 Projekt verzweigen
U hallo1/unterverzeichnis/blabla.c
[tmb@fuckupII tmb]$ cd hallo1/
[tmb@fuckupII hallo1]$ ls
CVS hallo.c unterverzeichnis
TODO readme
[tmb@fuckupII hallo1]$ cvs status hallo.c
========================================================
File: hallo.c Status: Up-to-date
[tmb@fuckupII hallo1]$
Die Marke version1-zweigwurde mit der -b-Option gesetzt. Danach
wurde mit cvs checkout -r version1-zweig -d hallo1 hallo eine
neue Arbeitskopie des Zweigs version1-zweig des Projekts hallo in
dem Ordner hallo1 angelegt. cvs status, am Beispiel von hallo.c, zeigt
an, dass es sich um einen Zweig handelt.
Obwohl hier auch ein sticky Tag gesetzt ist können trotzdemÄnde-
rungen vorgenommen werden, da es sich um einen Zweig handelt.
41
Verzweigungen
Beispiel:
42
13.2 Zweige verschmelzen
43
Verzweigungen
44
Anhang
45
Anhang A
Befehle
Befehl Alternativen Beschreibung Seite
init keine Neues Archiv 13
import im, imp Neues Projekt beginnen 15
checkout co, get Arbeitskopie auschecken 17
commit ci, comm Veränderungen einbringen 19
update up, upd Arbeitskopie aktualisieren 21
status st, stat Status anzeigen 25
log lo, rlog Log-Nachrichten anzeigen 27
diff di, dif Dateien/Revisionen vergleichen 29
add ad, new Datei hinzufügen 31
remove rm, delete Datei entfernen 32
tag ta, freeze Marke setzen 35
47
Befehle
48
Anhang B
Literatur
49