CVSFootNote(diese Seite heißt "cvs" und nicht "CVS", weil CVS nämlich zur Verwaltung ein Verzeichnis "CVS" benutzt - daher ist der Seitenname in Kleinbuchstaben geschrieben, um Konflikte zu vermeiden.) ist das "Concurrent Versions System", ein netzwerktransparentes Versionskontroll-System.
Im Bereich von FreeSoftware und OpenSource ist es sehr verbreitet, weil man damit im Team Software entwickeln kann, auch wenn die Programmierer über die ganze Welt verstreut sind.
Homepage: http://www.cvshome.org/ Online-Handbuch: http://www.cvshome.org/docs/manual/cvs.html
Lizenz: ["GPL"]
Mini-Howto
Außer der man-Page gibt es auch eine info-Seite zu cvs: info cvs
Generell nette Parameter für cvs (werden weiter unten nicht immer wieder wiederholt):
-z3 = gzip-Kompression verwenden (weniger Traffic, aber mehr CPU-Last auf CVS-Server)
-Q = leise - nur Fehlermeldungen ausgeben
Environment:
$ export CVS_RSH=ssh
Damit wird dann die Kommunikation verschlüsselt, wichtig v.a. für non-anonymous Accounts.
Einmalig den kompletten Source holen
Als erstes besorgt man sich mal nen kompletten CVS-Checkout des Wunschprojekts, das geht so:
# erstmal ein neues (temporäres) Verzeichnis anlegen: $ mkdir /home/egal ; cd /home/egal # dann beim CVS-Server anmelden (bei der Passwort-Frage einfach Enter drücken, also kein Passwort) $ cvs -d:pserver:anonymous@cvs.egal.de:/cvsroot/egal login # dann eine komplette Arbeitskopie der Sourcen "auschecken" (checkout, kurz co): $ cvs -z3 -d:pserver:anonymous@cvs.egal.de:/cvsroot/egal co .
In jedem Verzeichnis unter CVS-Kontrolle gibt es ein Unterverzeichnis "CVS".
Dort liegen für CVS wichtige Informationen, z.B. in der Datei "Root" steht der CVS-Root drin, ebenso Methode (pserver), Login (hier: anonymous), CVS-Server und der Anfang vom Pfad dort. In der Datei "Repository" steht der Rest vom Pfad dort.
Deshalb muss man die o.g. etwas "längeren" CVS-Aufrufe auch nur das erste Mal machen, ab dann "weiß" CVS, was es wo wie kriegt.
lokale CVS-Kopie aktuell halten
Angenommen wir wollen xxx mal wieder auf den aktuellen Stand bringen:
$ cd /home/egal/xxx # Updates holen/einbinden: $ cvs update
CVS holt sich dann aus ./CVS/Root die restlichen Informationen, stellt die Differenzen zwischen CVS-Server und lokaler Kopie fest und versucht auch gleich, die Unterschiede einzuarbeiten. Wenn man selbst Änderungen gemacht hatte, werden Sicherheitskopien angelegt (Filenamen mit .#<filename>-<alteversion>, sichtbar mit ls -a).
Falls es Konflikte gab, findet man nachher im Sourcecode Stellen, die in <<<<<<<<<<<<<<<<<< und >>>>>>>>>>>>>>>>> eingerahmt sind, dort muss man dann manuell nachhelfen und die Konflikte lösen.
eigene Änderungen auf den CVS-Server hochladen
Hierzu braucht mal erstmal nen CVS-Account mit mehr Rechten. "anonymous" darf nur lesen, aber nicht schreiben.
Danach sollte man folgendes beachten:
In ./CVS/Root steht immer noch "anonymous" drin - ändern!
Ebenso sollte man eine Environment-Variable mit "export CVS_RSH=ssh" setzen, damit ssh verwendet wird.
Bevor man was "commit"ed, sollte man es erst "update"n, sonst geht es wegen Konflikten möglicherweise nicht.
Also erst lokale Kopie updaten, Konflikte (falls vorhanden) lösen, kompilieren, testen.
Wenn Test OK und nichts anderes "kaputtgemacht" wurde, dann kurz vor dem commit nochmal kurz updaten, Konflikte?, kompilieren, kurzer Test und dann:
$ cd /home/egal/xxx $ # cvs login (falls noch nicht erfolgt) # eine geänderte Datei hochladen: $ cvs commit test.c oder # commited alle Änderungen im aktuellen Verzeichnis: $ cvs commit
CVS fragt dann einen Kommentar ab, den man sinnvoll ausfüllen sollte - damit wissen die anderen Entwickler, was man geändert hat. Der Name des Entwicklers wird automatisch ergänzt, ebenso eine neue Versionsnummer und ein Timestamp.
Das war's. Die lokale modifizierte test.c ist danach auf dem CVS-Server.
Arbeiten mit Branches
Branches sind Verzweigungen in der Entwicklungslinie in einem CVS-Repository.
- Auschecken: cvs co
- Branch erzeugen: cvs tag -b branchname
- Working Directory auf den Branch umstellen: cvs up -r branchname
- Änderungsschleife
- Änderungsschleife
- Änderungen machen: vi
- In den Branch Commiten: cvs ci
- Mit der Hauptlinie synchronisieren: cvs up -kk -j HEAD
- -kk verhindert unnötige Konflikte auf Zeilen mit Keywords (wie z.B. revision) - nicht verwenden, wenn Binärfiles im Repository sind!
wirklich? das tut bei mir nicht, das diff ist leer. vorher hab ich mit der hauptlinie synchronisiert - aber alles was im branch zusätzlich drin ist, sollte ja trotzdem im diff auftauchen!?
- Änderungsschleife
Alternativer Weg mit eigenem Repository
- "Original" auschecken: cvs co
- CVS-Verwaltung entfernen: find -name CVS -type d -exec rm -rf {} \;
- ist das notwendig? oder werden die von cvs gekonnt ignoriert?
- In eigenes Repository importieren: cvs import meinmodul ORIGINAL ORIGINAL_1.0
- Working Directory auschecken: cvs co meinmodul
- Änderungsschleife
- Änderungsschleife
- Änderungen machen: vi
- Commiten: cvs ci
- Original updaten: cvs up
- und importieren: cvs import meinmodul ORIGINAL ORIGINAL_1.1
- mit der eigenen Entwicklungslinie abgleichen: cvs up -j ORIGINAL
- wichtig: nach jedem Abgleich einen Tag setzen, z.B. merge1_from_ORIGINAL_to_trunk
- dann können beim nächsten Abgleich nur die Differenzen, die seither hinzugekommen sind, genommen werden: cvs up -j merge1_from_ORIGINAL_to_trunk -j ORIGINAL
- Änderungsschleife
CVS in Stichworten
- Neues Repository initialisieren (einmalig):
- cvs -d /pfad/zum/repository init
- Neues Projekt beginnen:
- cvs import -m "Log-Eintrag" projektname hersteller-marke versions-marke
projektname dient dann als Name eines neuen Unterverzeichnisses im Repository
- hersteller-marke = z.B. username / kürzel
- versionsmarke = z.B. start
- cvs import -m "Log-Eintrag" projektname hersteller-marke versions-marke
- Arbeitskopie auschecken:
- cvs checkout projektname
erstellt neues Unterverzeichnis projektname im aktuellen Verzeichnis und füllt es mit den entspr. Daten aus dem Repository
- cvs checkout projektname
- Eigene Arbeitskopie updaten:
- cvs [-q] update [-P]
- -q : quit (relativ leise, mehr ausgaben als bei -Q)
- -P : auch neue Verzeichnisse holen/anlegen
- cvs [-q] update [-P]
- Unterschied zwischen CVS und Arbeitskopie anzeigen:
- cvs [-Q] diff [-c]
- -Q : quiet (ruhig)
- -c : context diff generieren
- cvs [-Q] diff [-c]
- Revisionen anzeigen:
- cvs status dateiname
- Unterschiede zwischen verschiedenen Revisionen anzeigen:
- cvs diff -c -r 1.4 -r 1.5 dateiname
- Änderungen in's CVS hochladen:
- cvs commit -m "was hab ich getan"
- Änderung zurücknehmen:
- cvs update -j 1.3 -j 1.2 dateiname
- das führt eine Datei "dateiname" der Version 1.3 auf die Version 1.2 zurück (in der Arbeitskopie).
- cvs update -j 1.3 -j 1.2 dateiname
- Dateien hinzufügen:
- cvs add dateiname
- cvs commit -m "dateiname hinzugefügt bla bla" dateiname
- Verzeichnisse hinzufügen:
- cvs add dirname
- Binärdateien:
- CVS verwaltet Binärdateien - allerdings eher schlecht (weil dort keine Diffs gehen).
- Binärdatei hinzufügen:
- cvs add -kb dateiname
- Dabei werden keine Zeilenenden umgewandelt und auch keine Schlüsselwörter ersetzt (denn das würde eine Binärdatei zerstören!).
- Dateien entfernen:
- rm dateiname
- cvs remove dateiname
- cvs commit -m "dateiname entfernt" dateiname
- Verzeichnisse entfernen:
- cd dirname
- rm datei1 datei2 ...
- cvs remove datei1 datei2 ...
- cvs commit -m "blabla" datei1 datei2 ...
- cd ..
- cvs update -P
- Log-Nachrichten lesen:
- cvs log dateiname
- Dateien umbenennen:
- mv altername neuername
- cvs remove altername
- cvs add neuername
- cvs commit -m "altername umbenannt in neuername" altername neuername
- Standardoptionen setzen:
cat >>~/.cvsrc diff -c update -P cvs -q <Strg-D>
Damit werden dann immer Contextdiffs erstellt, update immer mit -P aufgerufen und cvs immer mit der globalen Option -q (also relativ "leise").
Mehr zu CVS steht in dem sehr nützlichen Buch "Open Source Projekte mit CVS" von Karl Fogel, mitp-Verlag, ISBN 3-8266-0628-0.
CVS GUI-Frontends
Es gibt verschiedene Ansätze, die angeblich viel zu komplizierte Benutzung von cvs durch ein GUI-Frontend zu vereinfachen.
Cervisia
Cervisia nutzt die QT-Bibliothek und ist eine wirklich praktische Sache. Cervisia ist in ["KDE"] 3 bereits enthalten und kann für ältere Versionen von http://cervisia.sourceforge.net runtergeladen werden. Cervisia kann die Struktur eines Repositories grafisch darstellen und auch Diffs farbig anzeigen.
CVS Utilities
Für CVS gibt es diverse unterstützende Programme um die Anwendung von CVS zu vereinfachen.
cvsfs
cvsfs ermöglicht die Einbindung eines CVS Repository analog zu einem mount-Befehl. Dabei werden die von CVS verwalteten Dateien in einem lokalen Verzeichnis eingeblendet. Ein Vorteil dabei ist, daß man die Dateien nicht erst per "cvs co" auf die lokale Platte kopieren muss, nur um zu sehen, ob es eine bestimmte Datei gibt. Eine weiterführende Beschreibung gibt es hier auf der Seite ["cvsfs"].