Tobias M.

B¨lz o

CVS
Eine Einfuhrung ¨

b¨lzebub.de o

Dieser Inhalt ist unter einem Creative Commons Namensnennung-NichtKommerziell-Weitergabe unter gleichen Bedingungen Lizenzvertrag lizenziert. Um die Lizenz anzusehen, gehen Sie bitte zu http://creativecommons.org/licenses/by-nc-sa/2.0/de/ oder schicken Sie einen Brief an Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

2

Inhaltsverzeichnis
Vorwort 1 Einleitung 1.1 Geschichte . . . . . . . . . 1.2 Konventionen . . . . . . . 1.3 Terminologie . . . . . . . 1.4 Beschaffung & Installation 1.5 Aufruf . . . . . . . . . . . 1.6 Zugriff auf ein Archiv . . 1.7 Vorbereitungen . . . . . . 2 Archiv anlegen 3 Neues Projekt beginnen 4 Arbeitskopie auschecken 5 Ver¨nderungen einbringen a 6 Arbeitskopie aktualisieren 7 Konflikte 8 Status der Arbeitskopie 9 Log-Nachrichten lesen 5 7 . 7 . 8 . 8 . 9 . 9 . 10 . 10 13 15 17 19 21 23 25 27

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

3

Inhaltsverzeichnis 10 Vergleiche 29

11 Dateien hinzuf¨ gen und entfernen u 31 11.1 Dateien hinzuf¨gen . . . . . . . . . . . . . . . . . . . . . . 31 u 11.2 Bin¨rdateien hinzuf¨gen . . . . . . . . . . . . . . . . . . . 32 a u 11.3 Dateien entfernen . . . . . . . . . . . . . . . . . . . . . . . 32 12 Marken 35

13 Verzweigungen 39 13.1 Projekt verzweigen . . . . . . . . . . . . . . . . . . . . . . 40 13.2 Zweige verschmelzen . . . . . . . . . . . . . . . . . . . . . 42

Anhang
A Befehle B Literatur

47
47 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 a a ¨ nachvollziehen zu k¨nnen. Um nicht jede Anderung selbst speichern zu o m¨ssen, gibt es Versionskontrollsysteme. Das wahrscheinlich am weitesu ten verbreitete ist das CVS – das Concurrent Versions System. Um die Beispiele in diesem Buch nachvollziehen zu k¨nnen, ist es o sinnvoll, schon einmal unter einem UNIX-¨hnlichen-Betriebssystem mit a der Konsole gearbeitet zu haben. Wer die ersten Seiten eines C-Buches gelesen hat, versteht auch das verwendete Beispielprogramm1 . Das CVS kann nat¨rlich viel mehr, als auf diesen nicht ganz 50 Seiten u beschrieben werden kann. Dies soll – wie der Titel schon sagt – auch nur eine Einf¨hrung sein. u

1 F¨ r alle anderen: Die main()-Funktion wird beim starten des Programms ausu gef¨hrt, printf() gibt eine Zeichenkette auf der Konsole aus u

5

Vorwort

6

Kapitel 1

Einleitung
CVS, das Concurrent Versions System1 , ist das f¨hrende Open-Sourceu Versionskontrollsystem. Es ist zur Verwaltung aller Arten von Textdateien geeignet, d. h. es k¨nnen nicht nur Quelltexte von Programmen, sondern auch z. B. o A HTML-Seiten oder L TEX-Dokumente verwaltet werden. Es ist (zumindest als Client) f¨r fast alle Plattformen verf¨gbar. Es ist u u also m¨glich, plattformunabh¨ngige Programme auch von verschiedenen o a Plattformen aus zu entwickeln. Da es freie Software ist, wird es zur Verwaltung vieler Open-SourceProjekte wie z. B. Mozilla, OpenOffice.org oder KDE verwendet. Auf sourceforge.net werden f¨r uber 60.000 Projekte CVS-Server zur Verf¨gu ¨ u ung gestellt. Dort ist z. B. der Java-Applikations-Server JBoss oder das Xbox-Linux-Projekt gehostet.

1.1

Geschichte

CVS basiert grundlegend auf dem Standard-Unix-Programm diff, einem Programm zum vergleichen zweier Dateien, und dessen Erweiterung ¨ patch von Larry Wall. Wird patch eine Datei mit den Anderungen, ein ¨ sogenannter Patch, ubergeben, f¨gt es die Anderungen in die entspreu ¨ chenden Dateien ein.
1 System

konkurrierender Versionen

7

Einleitung Auf diese Programmen baute auch schon das Revision Control System 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 o 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 erweia terte Jim Kingdon es um die Netzwerkf¨higkeit. a

1.2

Konventionen

Dateien, Internetadressen, etc. werden kursiv geschrieben. Befehle werden generell in Schreibmaschinenschrift dargestellt. Wird der Aufruf eines Programms beschrieben, stehen optionale Argument in eckigen Klammern, Argumente, die kursiv geschrieben sind, m¨ssen u ersetzt werden. Z.B.:
cvs import [Optionen ]Projektname Hersteller Versions-Marke

Kommandozeilenbeispiele werden in Schreibmaschinenschrift und einger¨ckt dargestellt: u [tmb@fuckupII tmb]$ whoami tmb [tmb@fuckupII tmb]$ Hier wird der Aufruf des Programms an einem Beispiel demonstriert. 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: a

8

1.4 Beschaffung & Installation Archiv (repository) Das Verzeichnis, in dem das CVS zentral das Projekt mit allen Ver¨nderungen speichert. a Arbeitskopie Die (lokale) Kopie, mit der der Entwickler arbeitet. Nur an ihr werden direkt Ver¨nderungen vorgenommen, die dann ins a Archiv ubernommen werden. ¨ Revision Die Revisionsnummer wird vom CVS intern verwendet. Sie bezieht sich auf eine einzelne Datei, nicht auf das gesamte Programm, und wird bei jeder Ver¨nderung erh¨ht. a o

1.4

Beschaffung & Installation

CVS wird bei den meisten Linux-Distributionen mitgeliefert. Bei Mac OS X befindet es sich im Developer-Packet. Ansonsten kann es unter www.cvshome.org/downloads.html f¨r die meisten Plattformen herunter u geladen werden. Da sich die Installation von Plattform zu Plattform unterscheidet, werde ich nicht darauf eingehen. Bitte beachten Sie dazu die README und INSTALL-Dateien der jeweiligen Distribution. Zu beachten ist, dass es sich bei den Versionen f¨r Macintosh (Sysu teme bis Mac OS 9) und Windows nur um Clients handelt, mit ihnen kann kein Server aufgesetzt werden.

1.5

Aufruf
cvs [globale Optionen] Befehl [Befehlsoptionen] [Dateien]

Der Aufruf des CVS sieht folgendermaßen aus:

Das CVS kann viele verschiedene Operation durchf¨hren. F¨r sie gibt u u es jeweils einen Befehl. Außerdem k¨nnen noch globale Optionen, die o f¨r alle Befehle gelten, und Befehlsoptionen, die vom jeweiligen Befehl u abh¨ngig sind, angegeben werden. Desshalb ist z. B. cvs -d /usr/local/ a archiv checkout nicht dasselbe wie cvs checkout -d /usr/local/archiv. Manche Befehle ben¨tigen noch (eine) Datei(en) als Argument. Diese o werden/wird als letztes ubergeben. ¨ F¨r die meisten Befehle gibt es Alternativen, haupts¨chlich Kurzforu a men und die Namen der Befehle des RCS (siehe Anhang A).

9

Einleitung

1.6

Zugriff auf ein Archiv

Das Archiv, auf das zugegriffen werden soll, wird mit dem (globalen) Argument -d2 angegeben. Bei einem lokalen Archiv wird einfach der absolute Pfad angegeben, z. B. cvs -d /usr/local/archiv Befehl . Soll uber das Netzwerk bzw. das Internet auf ein Archiv zugegrif¨ fen werden, muss zus¨tzlich die Zugriffsmethode, der Rechner und der a Benutzername angegeben werden. Dazu wird folgende Zeichenkette verwendet:
:Zugriffsmethode :Benutzer @Rechner :Verzeichnis

Die wichtigsten Zugriffsmethoden sind: ext Verwendet rsh, ssh oder ein anderes externes Programm, um die Verbindung zum Server aufzubauen. Das Programm, das verwendet werden soll, muss in der Umgebungsvariable $CVS RSH stehen. server Verwendet die interne rsh-Implementation. pserver Benutzt den Passwortauthentifizierungs-Server. Diese Methode wird oft f¨r den anonymen Zugriff verwendet. u local Greift auf eine lokales Archiv zu. Wie schon erw¨hnt, reicht es aus, a nur das Verzeichnis, in dem sich das Archiv befindet, anzugeben.

1.7

Vorbereitungen

Umgebungsvariablen
Wer immer auf dasselbe Archiv zugreifen will, sollte $CVSROOT setzen. Daduch wird die Angabe des Archivs mit -d uberfl¨ssig. u ¨ In einer der Variablen $CVSEDITOR, $VISUAL oder $EDITOR sollte 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 u

directory (Verzeichnis)

10

1.7 Vorbereitungen

Zu ignorierende Dateien
Wer programmiert testet seine Ver¨nderungen auch hin und wieder. Das a ausf¨hrbare Programm, die Objektdateien, etc. sollten jedoch nicht in u das Archiv ubernommen werden. Das CVS l¨sst sich so einstellen, das a ¨ es diese Dateien und Dateitypen ignoriert. Dazu gibt es drei M¨glichkeiten: o • F¨r alle Benutzer: Die Datei cvsignore im /etc-Verzeichnis u • Die Datei .cvsignore im Heimatverzeichnis • Die Umgebungsvariable $CVSIGNORE Da das CVS das Zeilenende an die jeweilige Plattform anpasst und Schl¨sselw¨rter in den Dateien ersetzt, sollten hier auch Bilder und anu o dere Bin¨rdateien angegeben werden, weil diese sonst zerst¨rt werden a o k¨nnen. Sie sollten explizit zum Projekt hinzugef¨gt werden (siehe Kao u pitel 11.2: Bin¨rdateien hinzuf¨gen). a u Es k¨nnen regul¨re Ausdr¨cke3 verwendet werden. o a u Eine typische .cvsignore eines Java-Entwicklers s¨he z. B. folgendera masen aus: *.class *.png .desktop Neben den kompilierten Java-Klassen werden hier auch png-Bilder und .desktop-Dateien, in denen KDE die Ansichtsoptionen des Ordners speichert, ignoriert.

3 siehe

man grep

11

Einleitung

12

Kapitel 2

Archiv anlegen
Um das CVS nutzen zu k¨nnen, muss ein Archiv vorhanden sein. Ein o 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 u man Schreibrechte haben. Beispiel: [tmb@fuckupII tmb]$ sudo cvs -d /usr/local/archiv init Password: [tmb@fuckupII tmb]$ ls -l /usr/local/archiv/ total 0 drwxrwxr-x 36 root wheel 1224 Dec 24 17:39 CVSROOT [tmb@fuckupII tmb]$ ls /usr/local/archiv/CVSROOT/ checkoutlist cvswrappers loginfo,v rcsinfo,v checkoutlist,v cvswrappers,v modules taginfo commitinfo editinfo modules,v taginfo,v commitinfo,v editinfo,v notify verifymsg config history notify,v verifymsg,v config,v loginfo rcsinfo [tmb@fuckupII tmb]$ 13

Archiv anlegen In der ersten Zeile wird das Archiv angelegt. Das ganze wird als root ausgef¨hrt (sudo), da Schreibberechtigung vorliegen muss. u Im entsprechenden Verzeichnis wird der Ordner CVSROOT angelegt. Darin werden die Konfigurationsdateien des Archivs gespeichert. Mit CVS einen Server aufzusetzen ist wesentlich komplizierter. Wie man an den Zugriffsmethoden schon sieht gibt es dazu auch mehrere M¨glichkeiten. Diese zu erkl¨ren w¨rde den Rahmen dieses Buches o a u sprengen.

14

Kapitel 3

Neues Projekt beginnen
Um ein Projekt mit CVS zu verwalten, muss es mit cvs import Projektname Hersteller-Marke Versions-Marke in ein Archiv importiert werden. Es werden alle Dateien des aktuellen Verzeichnis und seiner Unterverzeichnisse zum Projekt Projektname hinzugef¨gt. u Hersteller-Marke und Versions-Marke spielen in diesem Zusammenhang eigentlich keine Rolle. Als Hersteller-Marke verwendet man meistens seinen Benutzernamen, als Versions-Marke start . Außerdem sollte mit der Befehlsoption -m1 direkt eine Nachricht angegeben werden, sonst wird automatisch der Editor ge¨ffnet, wo die o Nachricht eingegeben werden muss.

1 f¨ r u

message (Nachricht)

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 No conflicts created by this import [tmb@fuckupII tmb]$ Als erstes wird $CVSROOT auf das vorher angelegte Archiv gesetzt. Das Beispielprojekt befindet sich im Ordner meinprojekt. Das eigentliche 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 weiteru arbeiten. Es muss erst eine Arbeitskopie angelegt werden.

16

Kapitel 4

Arbeitskopie auschecken
Eine Arbeitskopie legt man mit cvs checkout Projektname 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: [tmb@fuckupII tmb]$ cvs checkout hallo cvs checkout: Updating hallo U hallo/hallo.c U hallo/readme U hallo/sinnlos.h cvs checkout: Updating hallo/unterverzeichnis U hallo/unterverzeichnis/blabla.c [tmb@fuckupII tmb]$ ls hallo/ CVS/ readme unterverzeichnis/ hallo.c sinnlos.h [tmb@fuckupII tmb]$ Es wird eine Arbeitskopie des Projekts hallo angelegt. Im Verzeichnis der Arbeitskopie wird neben den Dateien des Projekts auch der Ordner

17

Arbeitskopie auschecken CVS erstellt. Darin speichert das CVS Informationen uber die einzelnen ¨ Dateien und das Archiv, in dem das Projekt verwaltet wird.

18

Kapitel 5

Ver¨nderungen a einbringen
Ver¨nderungen, die man in der Arbeitskopie gemacht hat, werden mit a cvs commit in das Archiv ubernommen. Da die Adresse des Archivs in der Arbeitsko¨ pie gespeichert wird, ben¨tigt commit keine Optionen. Es sollte jedoch, o wie bei import, direkt mit -m eine Nachricht angegeben werden. Beispiel: [tmb@fuckupII hallo]$ vi hallo.c
[. . . ]

[tmb@fuckupII hallo]$ cat hallo.c #include <stdio.h> int main(void) { printf("Hallo, Welt!\n"); printf("tschuess!\n"); return 0; } 19

Ver¨nderungen einbringen a [tmb@fuckupII hallo]$ cvs update cvs update: Updating . M hallo.c cvs update: Updating unterverzeichnis [tmb@fuckupII hallo]$ cvs commit -m "massive erweiterung" cvs commit: Examining . cvs commit: Examining unterverzeichnis Checking in hallo.c; /usr/local/archiv/hallo/hallo.c,v <-- hallo.c new revision: 1.2; previous revision: 1.1 done [tmb@fuckupII hallo]$ Die Datei hallo.c wurde ver¨ndert. Nach Hallo, Welt! wird jetzt noch a tschuess! ausgegeben. Vor dem Commit wird wird cvs update ausgef¨hrt (siehe Kapitel u 6: Arbeitskopie aktualisieren). Dabei wird uberpr¨ft, ob es im Archiv u ¨ evtl. eine neuere Revision einer Datei gibt. Dann kann das Commit nicht durchgef¨hrt werden. Wer das CVS nur allein verwendet, kann auf diesen u Schritt verzichten. Beim Commit untersucht das CVS als erstes die Arbeitskopie auf ver¨nderte Dateien. Diese werden dann in das Archiv ubernommen, die a ¨ Revisionen der entsprechenden Dateien werden erh¨ht. o

20

Kapitel 6

Arbeitskopie aktualisieren
Um Ver¨nderungen im Archiv, d. h. die Ver¨nderungen der anderen a a Entwickler, in die eigene Arbeitskopie zu ubernehmen gibt es den Befehl ¨ cvs update Er zeigt es auch an, wenn die Datei in der Arbeitskopie ver¨ndert a wurde. 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 a Ver¨nderungen wurden in die Arbeitskopie ubernommen (Das U vor a ¨ hallo.c steht f¨r update ). u

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 M 1 vor hallo.c sagt jedoch aus, dass diese Datei von einem selbst ver¨ndert wurde. a

1 f¨ r u

modified (ver¨ndert) a

22

Kapitel 7

Konflikte
Zu einem Konflikt kommt es bei einem Update, wenn man in der Arbeitskopie an einer Stelle etwas ver¨ndert, die inzwichen schon von jemand a anderem ver¨ndert und per Commit ins Archiv ubernommen wurde. a ¨ Beispiel: [tmb@fuckupII hallo]$ cvs update hallo.c RCS file: /usr/local/archiv/hallo/hallo.c retrieving revision 1.2 retrieving revision 1.3 Merging differences between 1.2 and 1.3 into hallo.c rcsmerge: warning: conflict during merge cvs update: conflicts found in hallo.c C hallo.c [tmb@fuckupII hallo]$ 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 folgenu a der Form in die Datei ein:
[. . . ]

<<<<<<< Dateiname Eigene Ver¨nderung a ======= 23

Konflikte Ver¨nderung im Archiv a >>>>>>> Revision
[. . . ]

Jetzt sollte man den Konflikt beheben und danach die konflikfreie Version per Commit ins Archiv ubernehmen. Dabei sollte man sich aber ¨ auf jeden Fall mit dem anderen Entwickler absprechen und nicht einfach ¨ die eigene Anderung ubernehmen, sonst arbeitet dieser (oder Sie) ganz ¨ schnell an einem anderen Projekt.

24

Kapitel 8

Status der Arbeitskopie
Den Status einer Datei kann man mit cvs status [Datei ] anzeigen. Wenn keine Datei angegeben wird, wird der Status jeder Datei des Projekts angezeigt. Beispiel: [tmb@fuckupII hallo]$ cvs status hallo.c ======================================================== File: hallo.c Status: Up-to-date Working revision: Repository revision: hallo.c,v Sticky Tag: Sticky Date: Sticky Options: [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: o 1.3 1.3 (none) (none) (none) Mon Mar 24 13:42:24 2003 /usr/local/archiv/hallo/

25

Status der Arbeitskopie • • Locally Modified heißt, dass die Datei in der Arbeitskopie ver¨na dert wurde. Needs Patch bedeutet, dass die Datei von jemand anderem ver¨ndert wurde. Dann ist die Revisionsnummer hinter Repository a ¨ revision h¨her als die hinter Working revision. Die Anderungen o werden beim n¨chsten Update ubernommen. a ¨

• Bei Needs Merge wurde die Datei von jemand anderem an der selben Stelle ver¨ndert, wie von Ihnen. Diese Ver¨nderungen a a m¨ssen zusammengef¨hrt werden. Wenn jetzt ein Update durchu u gef¨hrt wird, kommt es zu einem Konflikt. u Sticky Tag 1 oder Sticky Date 2 sind nur vorhanden, wenn ein Commit bzw. Update mit einer Marke oder einem Datum durchgef¨hrt wurde u (siehe Kapitel 12: Marken). Sticky Options sind Optionen, die einer Datei zugeordnet sind, bis sie wieder abgeschaltet werden.

1 Haftende

2 Haftendes

Marke Datum

26

Kapitel 9

Log-Nachrichten lesen
¨ Um einen groben Uberblick uber die Ver¨nderungen verwendet man a ¨ cvs log [Datei ] Wenn keine Datei angegeben wird, werden auch hier alle Dateien bearbeitet. Beispiel: [tmb@fuckupII hallo]$ cvs log hallo.c RCS file: /usr/local/archiv/hallo/hallo.c,v Working file: hallo.c head: 1.3 branch: locks: strict access list: symbolic names: start: 1.1.1.1 tmb: 1.1.1 keyword substitution: kv total revisions: 4; selected revisions: 4 description: ---------------------------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 Datum und den Autor der Ver¨nderung. Die Angaben hinter lines: geben a Aufschluss dar¨ber, wie viel ver¨ndert wurde. u a

28

Kapitel 10

Vergleiche
Um mehr uber die Ver¨nderungen zwischen den Revisionen zu erfahren, a ¨ gibt es mehrere M¨glichkeiten, diese zu vergleichen: o cvs diff Datei vergleicht die aktuelle Datei mit der Basisrevision, der Revision des letzten updates. Mit cvs diff -r Revision Datei kann man die Datei in der Arbeitskopie mit der angegebenen Revision im Archiv vergleichen. cvs diff -r Revision1 -r Revision2 verglicht Revision1 mit Revision2. Statt -r Revision kann man auch -D Datum verwenden. Dabei wird die neueste Revision, die nicht ¨lter als Datum ist, verwendet. a Außerdem gibt es noch eine Reihe Optionen, die mit denen des normalen GNU-diff -Programms ubereinstimmen. Die wichtigste ist wahr¨ scheinlich -c1 . Dadurch wird die Zeile vor und nach dem Unterschied auch angezeigt.

1 f¨ r u

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

Dateien hinzufugen und ¨ entfernen
11.1 Dateien hinzufugen ¨

Hin und wieder kommt es vor, dass zu einem Projekt eine neue Datei hinzugef¨gt werden muss. Dies geht mit u cvs add Datei Dadurch wird aber nur in der Arbeitskopie vermerkt, dass die Datei zum Projekt geh¨rt. Um die Datei in das Archiv zu ubernehmen, muss ein o ¨ commit durchgef¨hrt werden. u Beispiel: [tmb@fuckupII hallo]$ echo "So ziemlich alles" > TODO [tmb@fuckupII hallo]$ cvs add TODO cvs add: scheduling file ‘TODO’ for addition cvs add: use ’cvs commit’ to add this file permanently [tmb@fuckupII hallo]$ cvs commit -m "TODO hinzugefuegt" cvs commit: Examining unterverzeichnis RCS file: /usr/local/archiv/hallo/TODO,v done 31

Dateien hinzuf¨gen und entfernen u Checking in TODO; /usr/local/archiv/hallo/TODO,v initial revision: 1.1 done [tmb@fuckupII hallo]$

<--

TODO

Zuerst wird die Datei TODO erstellt. Mit cvs add wird sie zum Projekt hinzugef¨gt und dann mit cvs commit in das Archiv ubernommen. u ¨

11.2

Bin¨rdateien hinzufugen a ¨
cvs add -kb Datei

Das Hinzuf¨gen von Bin¨rdateien funktioniert ebenfalls mit add : u a

Hier wird allerdings mit -kb die Schl¨sselwortersetzung und das Ersetzen u der Zeilenenden abgeschaltet.

11.3

Dateien entfernen
cvs remove Datei

Um eine Datei aus dem Projekt zu entfernen gibt es den Befehl

Die Datei muss erst gel¨scht werden. Wie bei add wird das Archiv erst o beim n¨chsten commit ver¨ndert. Die Datei wird im Archiv nur als a a gel¨scht markiert, da sie von alteren Revisionen anderer Dateien evtl. o ¨ ben¨tigt wird. o 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 /usr/local/archiv/hallo/sinnlos.h,v <-- sinnlos.h new revision: delete; previous revision: 1.1.1.1 done [tmb@fuckupII hallo]$ Als erstes wird die Datei sinnlos.h gel¨scht. Danach wird sie mit cvs o remove zum entfernen vorgemerkt und dann mit cvs commit in Archiv als gel¨scht markiert. o

33

Dateien hinzuf¨gen und entfernen u

34

Kapitel 12

Marken
Mit einer Marke kann man die zusammengeh¨renden Revisionen der o Dateien markieren. Datei A 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Datei B 1.1 1.2 1.3 Datei C

1.4 Marke Damit kann man lauff¨hige Versionen markieren, um sp¨ter direkt a a auf diese zugreifen zu k¨nnen. o Eine Marke setzt man mit den Befehl cvs tag Name Dabei werden die Revisionen der Dateien der Arbeitskopie mit der Marke Name markiert. Der Name der Marke muss mit einem Buchstaben beginnen und darf nur Buchstaben, Ziffern, Bindestriche und Unterstriche enthalten.

1.1 1.2 1.3 1.4 1.5

35

Marken Beispiel: [tmb@fuckupII hallo]$ cvs tag version1 cvs tag: Tagging . T TODO T hallo.c T readme cvs tag: Tagging unterverzeichnis T unterverzeichnis/blabla.c [tmb@fuckupII hallo]$ Der jetzige Stand des Projekts wurde mit der Marke version1 gekennzeichnet. Um auf eine markierte Revision zuzugreifen verwendet man ebenfalls die -r-Option. Beispiel: [tmb@fuckupII tmp]$ cvs checkout -r version1 hallo cvs checkout: Updating hallo U hallo/TODO U hallo/hallo.c U hallo/readme cvs checkout: Updating hallo/unterverzeichnis U hallo/unterverzeichnis/blabla.c [tmb@fuckupII tmp]$ cd hallo/ [tmb@fuckupII hallo]$ ls CVS hallo.c unterverzeichnis TODO readme [tmb@fuckupII hallo]$ cvs status cvs status: Examining . ======================================================== File: TODO Status: Up-to-date Working revision: 1.1 Mon Mar 24 13:49:16 2003 Repository revision: 1.1 /usr/local/archiv/hallo/ TODO,v Sticky Tag: version1 (revision: 1.1) 36

Sticky Date: Sticky Options:

(none) (none)

======================================================== File: hallo.c Status: Up-to-date Working revision: Repository revision: hallo.c,v Sticky Tag: Sticky Date: Sticky Options: 1.3 1.3 Mon Mar 24 13:44:53 2003 /usr/local/archiv/hallo/

version1 (revision: 1.3) (none) (none)

========================================================
[. . . ]

[tmb@fuckupII hallo]$ Hier wird ein Checkout mit der Marke version1 durchgef¨hrt. Wie u cvs status anzeigt ist in der so neu angelegten Arbeitskopie version1 haftende Marke. Dies bedeutet, dass diese Arbeitskopie nicht aktualisiert werden und man Ver¨nderungen nicht ins Archiv ubernehmen a ¨ 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 a k¨nnen jedoch wieder verschmolzen, d. h. die Ver¨nderungen des einen o a in den anderen ubernommen, werden. ¨
Zweig

E
Verschmelzung

     

c Hauptentwicklungslinie

-

Es ist auch m¨glich, an einer Stelle mehrere Zweige zu erstellen und o einen Zweig weiter zu verzweigen. In den Zweigen werden andere Revisionsnummern vergeben: Der erste Zweig hat die Nummer der urspr¨nglichen Revision mit .2 anu geh¨ngt, z. B. 1.3.2 oder 1.27.8.45.2. Beim zweiten Zweig wird .4 ana geh¨ngt, beim dritten .6 usw. Die Revisionen werden dann in eia ner weiteren Nummer hochgez¨hlt, z. B. 1.3.2.1, 1.3.2.2, . . . oder auch a 1.27.8.45.2.13. Dies ist z. B. dann sinnvoll, wenn in einer stabilen Version 1.0 ein Fehler behoben werden soll, w¨hrend schon in Richtung Version 2.0 enta wickelt wird. Kurz bevor die Version 2 fertiggestellt wird werden die Bugfixes der 1. Version dann ubernommen. ¨ 39

Verzweigungen

13.1

Projekt verzweigen

Um einen Zweig zu erstellen m¨ssen zwei Schritte durchgef¨hrt werden: u u 1. Es muss eine Marke mit der -b1 -Option gesetzt werden: cvs tag -b Zweig-Marke Es ist sinnvoll, im Namen der Marke klar zu machen, dass es sich um einen Zweig handelt, indem man -zweig , -branch oder a a ¨hnliches anh¨ngt, vor allem weil Projekte oft an Stellen verzweigt werden, an denen es schon Marken gibt. 2. Um mit dem Zweig arbeiten zu k¨nnen legt man mit o cvs checkout -r Zweig-Marke -d Ordner Projektname eine neue Arbeitskopie an. Die Befehlsoption -d2 gibt dabei an, wo diese erstellt wird. Beispiel: [tmb@fuckupII hallo]$ cvs tag -b version1-zweig cvs tag: Tagging . T TODO T hallo.c T readme cvs tag: Tagging unterverzeichnis T unterverzeichnis/blabla.c [tmb@fuckupII hallo]$ cd .. [tmb@fuckupII tmb]$ cvs checkout -r version1-zweig -d hallo1 hallo cvs checkout: Updating hallo1 U hallo1/TODO U hallo1/hallo.c U hallo1/readme cvs checkout: Updating hallo1/unterverzeichnis
1 f¨ r u 2 f¨ r u

branch (Zweig) directory

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 Working revision: Repository revision: hallo.c,v Sticky Tag: Sticky Date: Sticky Options: [tmb@fuckupII hallo1]$ Die Marke version1-zweig wurde 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 trotzdemAndeo rungen vorgenommen werden, da es sich um einen Zweig handelt. 1.3 1.3 Mon Mar 24 13:44:53 2003 /usr/local/archiv/hallo/

version1-zweig (branch: 1.3.2) (none) (none)

41

Verzweigungen

13.2

Zweige verschmelzen

Um zwei Zweige zu verschmelzen, f¨hrt mann ein Update mit der -j3 u Option in der Arbeitskopie durch, in die die Ver¨nderungen des Zweigs a eingef¨gt werden sollen: u cvs update -j Zweig-Marke Dabei wird nur die Arbeitskopie ver¨ndert. Um die Ver¨nderungen in a a das Archiv zu ubernehmen, muss ein Commit durchgef¨hrt werden. u ¨ Beispiel: [tmb@fuckupII hallo]$ cvs update -j version1-zweig cvs update: Updating . RCS file: /usr/local/archiv/hallo/hallo.c,v retrieving revision 1.3 retrieving revision 1.3.2.1 Merging differences between 1.3 and 1.3.2.1 into hallo.c cvs update: Updating unterverzeichnis [tmb@fuckupII hallo]$ cvs update cvs update: Updating . M hallo.c cvs update: Updating unterverzeichnis [tmb@fuckupII hallo]$ cvs commit -m "mit version1-zweig verschmolzen" cvs commit: Examining . cvs commit: Examining unterverzeichnis Checking in hallo.c; /usr/local/archiv/hallo/hallo.c,v <-- hallo.c new revision: 1.4; previous revision: 1.3 done [tmb@fuckupII hallo]$ Zuerst wird der Zweig version1-zweig mit der Arbeitskopie verschmolzen. Nur hallo.c wurde ver¨ndert und wird jetzt zusammengef¨hrt. Danach a u wandern die Ver¨nderungen per Commit in das Archiv. a
3 f¨ r u

join (verbinden, zusammenf¨gen) u

42

13.2 Zweige verschmelzen Im Normalfall treten beim Verschmelzen einige Konflikte auf, weil sowohl der Zweig als auch die Hauptentwicklungslinie an der selben Stellen ver¨ndert wurden. Diese m¨ssen dann vor einem Commit behoben a u werden.

43

Verzweigungen

44

Anhang

45

Anhang A

Befehle
Befehl init import checkout commit update status log diff add remove tag Alternativen keine im, imp co, get ci, comm up, upd st, stat lo, rlog di, dif ad, new rm, delete ta, freeze Beschreibung Neues Archiv Neues Projekt beginnen Arbeitskopie auschecken Ver¨nderungen einbringen a Arbeitskopie aktualisieren Status anzeigen Log-Nachrichten anzeigen Dateien/Revisionen vergleichen Datei hinzuf¨gen u Datei entfernen Marke setzen Seite 13 15 17 19 21 25 27 29 31 32 35

47

Befehle

48

Anhang B

Literatur
• Per Cederqvist et al: Version Management with CVS. info cvs doc/ -Verzeichnis der CVS-Distribution http://www.cvshome.org/docs/manual/ • Karl Fogel: Open Source-Projekte mit CVS. 2002, MITP-Verlag; ISBN: 3-8266-0816-X http://cvsbook.red-bean.com/translations/german

49