|
[ Autoren gesucht! ]
|
PHP-Homepage.de sucht laufend Autoren für News und Artikel
Interesse?
|
|
 |
|
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
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 )
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
...
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.
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.
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.
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
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:
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.
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.
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 |