PHP-Logo
Druckansicht von http://www.php-homepage.de/artikel/artikel9.html

PHP-Logo
[ Main Menue ]
Homepage
Downloads
Artikel
Scripts
Forum
PHP-Manual
Links
News
Freelancer
Bücher
RuDolF
Suche
Misc
Über diese Seite
Kontakt
Wunschzettel
MyGuestbook
*
[ Suche ]
*
[ Partner ]


Domain Webhosting
*
[ Partner Sites ]
Dynamic-Webpages
PHP-Center
PHP-Welt
phpUG.de
Random Link
*
[ Autoren gesucht! ]
PHP-Homepage.de sucht laufend Autoren für News und Artikel
Interesse?
*

Follow on Twitter - @phphomepage

RSS Feed blogoscoop

CVS - Das Concurrent Versions System - Von Thomas Fromm

eine kleine Einführung von Thomas Fromm <tf@tfromm.com>

Inhalt:

CVS schafft Ordnung
Die Installation des Servers
Das Einrichten des Netzwerkes und Hinzufügen von Repositories
Hinzufügen von Modulen zu einem Repository
Auschecken von Modulen
Dateien löschen/hinzufügen zum Modul
Änderungen mitteilen
Module aktualisieren
Anonyme User
Zum Abschluss

CVS schafft Ordnung

Es ist in aller Munde und besonders in der Open Source Gemeinschaft nicht mehr wegzudenken. Doch was macht CVS und wo liegen die Vorteile?

Wer mit mehreren Leuten an einem Projekt beteiligt ist, kennt möglicherweise die Probleme, ständig müssen alle Dateien auf dem aktuellen Stand sein und wehe, wenn jemand was geändert hat und vergessen hat, es den anderen mitzuteilen. Solche Probleme erzeugen unnötigen administrativen Aufwand und können die Entwicklung stark behindern. Abhilfe schafft dort CVS. CVS ermöglicht das Einspielen von Änderungen, fügt die unterschiedlichen Codestücke zusammen und man kann damit Versionen der Software nach Datum auslesen, um z.B. ältere Versionen nochmal betrachten und vieles mehr.
Diese Tutorial wird sich damit befassen, wie ihr einen CVS-Server aufsetzt und in der Basis mit ihm umgeht. (dieses Tutorial beschreibt die Installation und Benutzung auf einem Unixsystem, aber es existieren auch Server/Clients für andere OS z.B. WinCVS )

Die Installation des Servers

Es ist nötig, dass ihr auf Eurem System cvs z.B. als rpm installiert habt. (http://www.cyclic.com)
Desweiteren sollte ein User cvs ohne Passwort eingerichtet werden (niemand soll sich als cvs einloggen können) und sein Homeverzeichnis setzen wir auf /home/cvs. Auf dieses Verzeichnis setzen wir als User cvs die Umgebungsvariable CVSROOT mit:
(bash)
export CVSROOT=/home/cvs
(tcsh/csh)
setenv CVSROOT /home/cvs

Mit dem Befehl

cvs init

wird im Homeverzeichnis ein Unterverzeichnis CVSROOT mit einigen Dateien angelegt.

Nun möchten wir ein Repository anlegen. Ein Repository ist ein Verzeichnis auf dem Server in dem die Module liegen.
Beispiel: Im Repository /home/cvs/phpOracleAdmin liegt das Modul phpOracleAdmin (das Hauptprogramm des Projektes) und www (die Webseiten des Projektes).

export CVSROOT=/home/cvs/test

cvs init

Damit wurde das Repository 'test' angelegt. Damit wir von ausserhalb zugreifen können müssen nun die User und deren Passwörter angelegt werden. Dazu legen wir im Verzeichnis /home/cvs/test/CVSROOT/ die Dateien passwd und writers an. In die passwd Datei kommen alle User und deren Passwörter in der Form:

<login>:<passwd>:cvs

Passwörter können generiert werden z.B. durch htpasswd (gehört zum Apache)

htpasswd -bc pwdfile tf test

schauen wir nun ins pwdfile steht dort eine Zeile:

tf:cOYEWO52hnJoc

diese nehmen wir und schreiben sie in die /home/cvs/test/CVSROOT/passwd mit dem zusätzlichen :cvs

Beispiel:
tf:cOYEWO52hnJoc:cvs

Die Datei writers beinhaltet alle zum Schreiben berechtigten User.
Für alle anderen gelten nur Leserechte.
z.B.:
tf
su
...

Das Einrichten des Netzwerkes und Hinzufügen von Repositorys

Dies ist recht einfach, da der CVS 'pserver' vom inetd gestartet wird. Sicherzustellen ist, dass sich in der /etc/services folgende Zeile befindet:

cvspserver 2401/tcp #CVS network server

und nun nur noch diese Zeile in die /etc/inetd.conf hinzufügen:

cvspserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/cvs/test pserver

Für jedes weitere Repository muss ein --allow-root=/home/cvs/<repositoryname> hinzugefügt werden und der inetd restartet werden via:

root@stargazer:~ > /etc/rc.d/inetd restart

An dieser Stelle ein Hinweis:
Die Zeile wo alle Repositories via --allow-root hinzugefügt wurde kann nur max 256 Zeichen lang sein. Hier kann man folgendes tun und in die /etc/inetd.conf die Zeile statt der o.g. angeben:

cvspserver stream tcp nowait root /etc/cvspserver.sh cvspserver

und die Datei /etc/cvspserver.sh müsste so aussehen:

#!/bin/sh
/usr/bin/cvs --allow-root=/home/cvs/test --allow-root=/home/cvs/test2 ... pserver

Diese Zeile kann (fast) beliebig lang sein.

Versuchen wir nun, von einem anderen Rechner auf diesen zuzugreifen müssen wir zuerst die CVSROOT Variable setzen und uns via 'cvs login' einloggen:

export CVSROOT=:pserver:<username>@<hostadresse>:<pfad zum repository>

Beispiel:

tfromm@defiant:~ > export CVSROOT=:pserver:tf@stargazer:/home/cvs/test
tfromm@defiant:~ > cvs login
(Logging in to tf@stargazer)
CVS password:
tfromm@defiant:~ >

Nach dem Eingeben des Passworts sollte keine Fehlermeldung kommen, dann ist alles ok. :)
Fall ein Fehler dieser Art auftaucht:
'cvs [login aborted]: authorization failed: server stargazer rejected access'
Bitte Passwort überprüfen, CVSROOT überprüfen und schauen, das das --allow-root=... korrekt in der /etc/inetd.conf steht und der inetd restartet wurde nach dem updaten.

Hinzufügen von Modulen zu einem Repository

Ein solches Modul ist z.B. ein gerade begonnendes Projekt ich nenne es mal 'test_teil1'. Dieses Modul soll zum Repository 'test' gehören.
Der bereits bestehenden Quellcode fügt man so hinzu:
(es reicht wenn die CVSROOT Umgebungsvariable einmal gesetzt ist)

tfromm@defiant:~ > export CVSROOT=:pserver:tf@stargazer:/home/cvs/test
tfromm@defiant:~ > cd ~/Projekte/test_teil1
tfromm@defiant:~ > cvs import test_teil1 hierkannstehenwaswill START

dann erscheint eine Reihe von Dateien, die rekursiv ab dem Startdirectory hinzugefügt wurden und letztendlich ein:

No conflicts created by this import

Damit ist das Modul 'test_teil1' angelegt und mit seinen Dateien im CVS.

Auschecken von Modulen

Nach diesem Import wollen wir unser 'test_teil1' initial auslesen:

tfromm@defiant:~ > cd ~/tmp
tfromm@defiant:~/tmp > cvs checkout test_teil1

nun werden alle Files vom Server geholt. Dieses braucht man nur einmal zu tun.

Dateien löschen/hinzufügen zum Modul

Will man nachträglich Dateien hinzufügen geht das folgendermassen:

tfromm@defiant:~/tmp > cp ~/wurst.php ~/tmp/test_teil1
tfromm@defiant:~/tmp > cvs add wurst.php
cvs server: scheduling file `wurst.php' for addition
cvs server: use 'cvs commit' to add this file permanently

will man eine Datei aus dem Modul löschen geht es ähnlich:
tfromm@defiant:~/tmp > rm hans.html
tfromm@defiant:~/tmp > cvs rm hans.html
cvs server: scheduling `hans.html' for removal
cvs server: use 'cvs commit' to remove this file permanently

Änderungen mitteilen

Gemachte Änderungen an Dateien werden durch 'commit' dem Server mitgeteilt.

tfromm@defiant:~/tmp cvs commit

Nun eröffnet sich einem der formschöne und praktische, aber leider völlig unintuitive Editor vi, um den commit Kommentar einzugeben.
Sinnvoll ist es, sofern man nicht firm ist mit dem vi die EDITOR Umgebungsvariable auf einen Editor eigener Wahl zu setzen z.B.:

export EDITOR=pico

Nach dem Abspeichern und Beenden des Editors, werden die geänderten Files an der Server übermittelt. Sinnvoll ist es, vor einem commit nochmal ein update seines Modules zu machen:

Module aktualisieren

Diese Funktion sollte man mindestens am Beginn eines Arbeitstages durchführen, und vor einem commit.
Es reicht aus, in das Modulverzeichnis zu wechseln:

tfromm@defiant:~ > cd ~/tmp/test_teil1
tfromm@defiant:~/tmp > cvs update -dPA

Nun werden die Dateien aktualisiert.
Die Bedeutung der empfohlenen Optionen entnehmt bitte der Manualseite vom cvs:

man cvs

dort findet ihr auch weitere Optionen, die Euch das Leben erleichtern sollen :-).

Hinweis:
Sind es viele Projektfiles macht es machmal Sinn zusätzlich mit der Option -z9
zu arbeiten:

tfromm@defiant:~/tmp > cvs update -z9 -dPA

Dort werden die Daten beim Server gepackt ausgeliefert und beim Client entpackt.
2.Hinweis:
Treten Mergingprobleme auf, die das CVS nicht selbst fixen kann (z.B. 2 User haben etwas in derselben Zeile editiert) wird dies meist schon durch ein 'C' vor dem Dateinamen beim updaten kenntlich gemacht. Nun muss man die Konflikte die durch >>>>> und <<<<< markierten Stellen in der Datei selbst beheben.

Anonyme User

Bei freier Software möchte man oft den anderen Lesezugriff als anonymous auf das Repository erteilen, dazu ist lediglich in der Datei passwd im CVSROOT Verzeichnis auf dem Server die Zeile:

anonymous::anonuser

hinzuzufügen, was einem anonymous User den Lesezugriff ohne Passwort ermöglicht.

Zum Abschluss

CVS umfasst noch erheblich mehr als die hier nur rudimentär angeschnittenen Punkte. So ist es möglich auch Zustände des Repositorys zu einem bestimmten Zeitpunkt auszuchecken oder in mehreren Entwicklungszweigen (z.B.: bei Versionierungen und den darauffolgenden Bugfixreleases wichtig) durch Branches zu arbeiten. Ich möchte jedem weitergehend Interessierten das CVSBook (http://cvsbook.red-bean.com) empfehlen, welches alle Möglichkeiten des CVS sehr verständlich erklärt.

Viel Erfolg beim Probieren!

Thomas
PS: Ich danke #php.de für den Syntax-Check dieses Textes :)

Zurück zur Übersicht
© Copyright 1999 - 2011 by Mark Kronsbein | Impressum | NutzungsbedingungenWeiterempfehlen | Seitenanfang
0.0222