-
Beiträge/Danksagungen
Ich bedanke mich ausdrücklich bei den folgenden Personen
für kritische und nützliche Anmerkungen zu dieser eigenen CVS-FAQ:
-
Übungsteilnehmerinnen und -teilnehmer des Kurses
"Computational Geometry" (WS 2001/2002) an der
Universität Bayreuth, insbesondere bei
Gilbert Perria
-
Michael Butscher
-
Frithof Meyer
Bei Anmerkungen/Kritik bitte eine e-mail
an
Robert Baier
()
senden.
-
Was bedeutet CVS?
CVS steht für Concurrent Versions
System,
also eine Software zur netzweiten Versionsverwaltung von
Dokumenten.
-
Wie funktioniert CVS?
CVS ist eine Client-Server-Anwendung.
Der CVS-Server ist
im WAP-Pool der Fileserver btcipmatx15.cip.uni-bayreuth.de.
Er verwaltet in einem CVS-Root-Verzeichnis
(am WAP-Pool: /share/cvs-repository)
in zahlreichen Unterverzeichnissen (in CVS Module genannt)
die Versionen, Kommentare
zu den Versionen und ermöglicht das Vergleichen,
Abrufen von alten und neuen Versionen und das Veröffentlichen
von aktuell erstellten Versionen.
Der CVS-Client heißt unter Linux einfach cvs.
Mit zahlreichen Argumenten ermöglicht er durch den Kontakt
mit dem CVS-Server über ein CVS-Protokoll das
Vergleichen,
Abrufen von alten und neuen Versionen und das Veröffentlichen
von aktuell erstellten Versionen.
Als CVS-Protokoll bieten sich pserver,
rsh und rsh an. Am WAP-Pool wird das Protokoll
pserver verwendet für die Kommunikation zwischen
CVS-Server und CVS-Client.
Alle Einstellungen zu CVS-Protokoll, CVS-Server und CVS-Rootverzeichnis
stehen praktischerweise in der Environment-Variable CVSROOT,
siehe Frage zu Environment-Variablen.
-
Wo bekomme ich CVS her?
In jeder normalen Linux-Distribution sollte es ein CVS-Paket geben,
dass man ggf. nachinstallieren muss (in SuSE mit yast/yast2).
Am WAP-Pool ist der CVS-Client "cvs" schon installiert.
Den Sourcecode zu CVS und Binaries für gängige Betriebssysteme (Win32, Linux, MacOS, ...) kann man unter
Downloads des CVS-Projekts
unter "Documents & Files/ccvs/binaries"
herunterladen. Es gibt auch (mehrere)
Windows-Versionen von CVS.
-
Gibt es grafische Programme für die CVS-Benutzung?
Es gibt u.a. folgende grafische Programme, die den Umgang mit CVS erleichtern:
In einige GUI-Programme kann man grafische Vergleichsprogramme einbinden wie z.B.
Name des Programms
|
nötiges Betriebssystem
|
KDiff
(veralteter Vorgänger von Kompare)
|
Linux mit KDE 3/MS-Windows
|
KDiff3
|
Linux mit KDE 3/MS-Windows/Unix mit Qt
|
Kompare
(KDE-Nachfolger von KDiff)
|
Linux mit KDE 3
|
WinMerge
|
Win32
|
-
Gibt es CVS auch unter Windows?
Ja, am besten schaue man unter
CVS-Win32-Binaries
(CVS-Projekt) nach. Dort gibt es den aktuellen (spartanischen)
CVS-ASCII-Client "cvs.exe" (im ZIP-File bei den Win32-Binaries) und
Hinweise auf andere grafische CVS-Clients.
Der grafische Client WinCVS vom
CvsGui-Projekt (alternativ: CvsGui-Projekt bei Sourceforge;
früher: www.cvsgui.org) ist ein gutes Programm für Windows-Betriebssysteme.
Als (grafisches) Programm bei Vergleichen verschiedener Versionen kann man
WinMerge in WinCVS integrieren.
-
Was muss ich beim ersten Mal beachten, wenn ich
CVS nutzen will?
Fazit:
Man muss folgende Schritte machen:
-
Zugehörigkeit zur Benutzergruppe cvs sicherstellen
-
Environment-Variablen CVSROOT und CVSEDITOR setzen
und diese zum Startup-File der Shell hinzufügen
-
CVS-Kommando cvs login
-
CVS-Kommando cvs checkout <Modul>
Im Detail:
-
Der Superuser muss mich zur Benutzergruppe (am WAP-Pool:
cvs)
hinzufügen, damit ich CVS prinzipiell benutzen kann.
Er muss mich ebenfalls zur Benutzergruppe (am WAP-Pool:
cgal) hinzufügen, damit ich ein spezielles
CVS-Unterverzeichnis lesen kann, das die CGAL-Informationen
enthält.
Als letztes muss er ein CVS-Password (am WAP-Pool: das zum
Zeitpunkt der Aufnahme in die CVS-Passworddatei gültige
WAP-Pool-Password) in eine interne CVS-Password-Datei eintragen.
-
Man selbst sollte zwei Environment-Variablen setzen,
die den Umgang
mit CVS wesentlich erleichtern. Environment-Variablen werden
in der Shell gesetzt und vom CVS-Client ausgewertet.
Die Environment-Variable CVSROOT gibt den CVS-Usernamen
(am WAP-Pool: der normale Benutzername), den CVS-Server,
das verwendete CVS-Protokoll und das CVS-Root-Verzeichnis an.
Beispiel:
Setzen von CVSROOT für den User cgeom02 mit der
Bash als Shell:
CVSROOT=":pserver:cgeom02@btcipmatx15.cip.uni-bayreuth.de:/share/cvs-repository"
export CVSROOT
Da man Versionsänderungen unbedingt
kommentieren sollte, startet der CVS-Client automatisch einen Editor.
Als Standard vi, einen Editor mit etwas
gewöhnungsbedürftigen Kommando- und Editormodi. Um
stattdessen den eigenen Lieblingseditor zu verwenden, setzt man besser
die Environment-Variable CVSEDITOR.
Um z.B. den Editor nedit zu verwenden, setzt man
CVSEDITOR=/usr/bin/X11/nedit
export CVSEDITOR
Um den genauen Pfad des Lieblingseditors zu erfahren, kann
man z.B. folgendes machen:
whereis nedit
# liefert das Ergebnis:
nedit: /usr/X11R6/bin/nedit /usr/X386/bin/nedit /usr/bin/X11/nedit /usr/X11/bin/nedit
/usr/X386/man/man1/nedit.1.gz /usr/X11/man/man1/nedit.1.gz
Da das Executable nedit durch Links in vier
verschiedenen Stellen zu finden ist, kann eine der ersten
vier Antworten genommen werden, die anderen beiden Antworten
vom Unix-Befehl whereis sind nur die Manual-Seiten.
Tipp:
Damit man nicht in jedem neuen Terminalfenster/Shell
die obigen Befehle eingeben muss, fügt man diese
Befehle am besten ganz ans Ende der Datei
$HOME/.bashrc ein,
die beim Start jeder Shell/jedes Terminalfensters gelesen
und interpretiert wird.
# Bash knows ... (1. Zeile von .bashrc)
...
export DISPLAY LESS PS1 PS2
umask 022 (Ende von .bashrc)
# lokale Aenderungen fuer CVS:
CVSEDITOR=/usr/bin/X11/nedit
CVSROOT=":pserver:cgeom02@btcipmatx15.cip.uni-bayreuth.de:/share/cvs-repository"
export CVSEDITOR CVSROOT
Achtung:
Jegliche Änderung der Datei $HOME/.bashrc
wirkt sich erst auf zukünftig gestartete
Terminalfenster/Shells aus und nicht schon auf das
aktuelle Terminalfenster/Shell. Deshalb sollte man unbedingt
ein neues Terminalfenster/Shell starten. Wenn man sich einmal
ausgeloggt und wieder eingeloggt hat, gibt es dieses Problem
nicht mehr ... .
-
Man muss sich einmalig bei CVS anmelden.
Dies geschieht durch den Befehl
cvs login
Es erscheint für den User cgeom02 die Frage
(Logging in to cgeom02@btcipmatx15.cip.uni-bayreuth.de)
CVS password:
Bei korrekter Eingabe des CVS-Passwords passiert weiter nichts,
nur bei falscher Eingabe (oder auch beim falschen Setzen der
Environment-Variable CVSROOT) kommt die Meldung
cvs [login aborted]: authorization failed: \
server btcipmatx15.cip.uni-bayreuth.de rejected access
Es entsteht bei korrekter Eingabe die Datei
$HOME/.cvspass. Solange man sie nicht löscht,
muss man diese Login-Prozedur nicht mehr durchführen.
Warnung:
Diese nur für den Benutzer lesbare Datei enthält
eine schlecht verschlüsselte Version des CVS-Passwords.
Man sollte diese Datei also geheim halten!
-
Jetzt sollte man ein eigenes lokales
CVS-Arbeitsverzeichnis erstellen
(am WAP-Pool z.B.
$HOME/cvs-work durch den Unix-Befehl mkdir $HOME/cvs-work)
und in dieses Unterverzeichnis durch den Unix-Befehl
cd $HOME/cvs-work für alles weitere wechseln.
-
Jetzt kann man einmalig ein neues CVS-Modul/CVS-Projekt
auschecken.
Für diese Vorlesung sind die CVS-Module
CGAL (Vorlesung/Übung zu Computational
Geometry) und test (zum Testen von CVS-Befehlen,
hat ansonsten keinen Zweck). Nach dem Wechseln in das
lokale CVS-Verzeichnis $HOME/cvs-work gibt man ein:
cvs checkout CGAL
Dann werden automatisch alle Files und Subdirectories
des CGAL-Moduls in der momentan aktuellen Fassung erstellt.
Der CVS-Server hat dieses Modul mit allen Versionsinformationen
am WAP-Pool unter /share/cvs-repository/CGAL
abgespeichert.
-
Kann ich bei CVS auf einen CVS-Server verzichten
bzw. kann ich CVS nutzen, ohne an einem CVS-Server registriert zu sein?
Ja, das geht (ist eigentlich ganz einfach). Allerdings hat man dann
zwei wichtige CVS-Unterverzeichnisse lokal am Rechner: erstens das
lokale CVS-Server-Repository (im folgenden unter
"$HOME/cvs-local-rep"), in dem CVS die Versionsunterschiede,
die Kommentare zu den Versionen und die Konfigurationsfiles speichert
und zweitens das lokale CVS-Arbeitsverzeichnis (im folgenden unter
"$HOME/cvs-work"), in dem man die mit
CVS verwalteten Files auscheckt, bearbeitet, neue Versionen
veröffentlicht, ... .
Außerdem sollte es einem klar sein, dass das nur Sinn macht, wenn
man alleine auf einem Rechner entwickelt. Sollte man
gleichzeitig auf mehreren Rechnern alleine oder gar in einem
Team entwickeln, ist es normalerweise immer sinnvoll, einen eigenen
CVS-Server zu nutzen, um nicht auf einen Rechner festgelegt zu sein.
Fazit:
Man muss folgende Schritte machen:
Im Detail:
Man muss folgende Schritte machen:
-
Anlegen eines neuen Verzeichnisses (z.B. "$HOME/cvs-local-rep")
für das lokale CVS-Repository:
mkdir $HOME/cvs-local-rep
-
Setzen der Environment-Variable CVSROOT auf Protokoll
"local" und Spezifikation des lokalen CVS-Repositories,
z.B.
# unter der Bash-Shell:
export CVSROOT=:local:$HOME/cvs-local-rep
-
Erzeugen der nötigen Files für das lokale
CVS-Server-Repository mit "cvs init"
# Kommando gibt normalerweise nichts aus
cvs init
# Ansehen des neuen lokalen CVS-Server-Repositories
ll $HOME/cvs-local-rep
# typische Ausgabe:
insgesamt 1
drwxrwxr-x 2 btm506 users 900 Apr 11 09:58 CVSROOT
Es entsteht im lokalen CVS-Server-Repository das neue Unterverzeichnis
"CVSROOT", das alle wesentlichen Files zur Benutzung
des lokalen "CVS-Servers" enthält.
Es enthält aber kein File "passwd", so dass im folgenden
ein "cvs login" überflüssig ist.
# "cvs login" braucht man nicht
cvs login
# typische Ausgabe:
cvs login: can only use pserver method with `login' command
cvs [login aborted]: CVSROOT: :local:/home/btm506/cvs-local-rep
-
Einbringen schon vorhandener Files in das lokale CVS-Server-Repository
mit "cvs import", z.B.
# Files und Unterverzeichnisse unter $HOME/programme
# sollen unter CVS-Verwaltung
cd $HOME/programme
# nur zwei Files im Verzeichnis: "Readme.txt" und "prog_1.cpp"
ll
# typische Ausgabe:
insgesamt 20
-rw-r--r-- 1 btm506 users 2328 Apr 11 10:16 Readme.txt
-rw-r--r-- 1 btm506 users 15122 Apr 11 10:16 prog_1.cpp
# neues CVS-Modul für die Files soll "progs" heißen
# Option "-m": CVS-Kommentar für 1. Version
# name: sog. Vendor-Tag, d.h. symbolische Bezeichnung
# fuer 1. Entwicklungszweig (first-level branch)
# Da "vendor" im CVS-Terminus der Hersteller/Entwickler
# der Dateien ist, kann man hier seinen eigenen Nachnamen
# spezifizieren
# start: sog. Release-Tag, d.h. symbolische Bezeichnung
# fuer 1. Import des 1. Entwicklungszweig (first leave)
# Man verwendet üblicherweise "start" als Release-Tag
cvs import -m "meine Programme" progs nachname start
# typische Ausgabe:
N progs/prog_1.cpp
N progs/Readme.txt
No conflicts created by this import
# es entsteht unter dem lokalen CVS-Server-Repository das neue
# Unterverzeichnis $HOME/cvs-work/progs
ll $HOME/cvs-local-rep
# typische Ausgabe:
drwxrwxr-x 2 btm506 users 900 Apr 11 10:11 CVSROOT
drwxrwxr-x 2 btm506 users 91 Apr 11 10:16 progs
ll $HOME/cvs-local-rep/progs
# typische Ausgabe:
insgesamt 20
-r--r--r-- 1 btm506 users 2711 Apr 11 10:16 Readme.txt,v
-r--r--r-- 1 btm506 users 15507 Apr 11 10:16 prog_1.cpp,v
-
Auschecken dieser Files im lokalen CVS-Arbeitsverzeichnis
mit "cvs checkout"
# ins lokalen CVS-Arbeitsverzeichnis wechseln
cd $HOME/cvs-work
# Auschecken der mit "cvs import" eingestellten Version
cvs checkout progs
# typische Ausgabe:
cvs checkout: Updating progs
U progs/Readme.txt
U progs/prog_1.cpp
-
Wie kann ich CVS ausprobieren, ohne etwas an einem
CVS-Modul zu ändern?
Fazit: Die entscheidenden Kommandos sind:
Im Detail:
Man legt einfach ein neues CVS-Modul an, mit dem man die CVS-Kommandos
für dieses CVS-Modul ausprobiert. Am WAP-Pool ist bereits ein
CVS-Modul namens "test" dafür vorgesehen. Dieses dient
ausschließlich zum Testen von CVS-Kommandos. Man checkt dieses
einmal aus wie unter Checkout beschrieben
und testet in diesem CVS-Modul, was man eigentlich in einem anderen
CVS-Modul vorhat.
Beispiel:
cd $HOME/cvs-work
# Auschecken vom CVS-Modul "test"
cvs checkout test
# Wechseln in das lokale Arbeitsverzeichnis fuer das CVS-Modul "test"
cd test
# Test der CVS-Kommandos dort
...
-
Welche Dateien/Verzeichnisse kann ich mit CVS verwalten?
Am meisten Sinn macht es, Textdateien mit CVS zu verwalten.
Prinzipiell ist es auch möglich, Binärdateien unter
CVS-Verwaltung zu stellen (vgl. zugehörige
Frage), allerdings muss man diese ggf. als Binärdateien
kennzeichnen bei CVS-Aufrufen. Sinnlos ist es, Executables,
Objectfiles oder Ähnliches in CVS aufzunehmen, da man diese
immer aus den Quelldateien wieder erstellen kann. Solche Files
benötigen nur Speicherplatz am CVS-Server ... .
Als Anwendungsfälle kann man die Entwicklung eines Programmes/einer
Programmbibliothek nennen (vor allem dann, wenn man das in einem Team
macht, aber auch, wenn man das Programm selbst entwickelt, ist das
sinnvoll), die Erstellung der Diplomarbeit in LaTeX oder von
Dokumentationen, der Austausch von Textdateien in einem Team, ... .
Immer muss man jedoch das Verzeichnis, in dem die
Files/Unterverzeichnisse stehen, bereits unter CVS-Verwaltung gestellt
haben. Dies erkennt man leicht daran, dass es ein Unterverzeichnis
"CVS" gibt, in dem die Files
stehen (vgl. die Antwort zur Frage zu den
entstehenden lokalen Files).
Das Unterverzeichnis und die genannten Files sollte man
keinesfalls löschen oder modifizieren. Sie dienen CVS als
interne Files und sind wichtig für das korrekte Ablaufen der
CVS-Kommandos.
Versucht man in einem Unterverzeichnis ohne CVS-Verwaltung
CVS-Kommandos einzugeben, erscheinen Fehlermeldungen wie im
folgenden Beispiel.
Beispiel:
cd $HOME/work
# kein Unterverzeichnis "CVS" vorhanden
# --> keine CVS-Verwaltung des Verzeichnisses $HOME/work
ll CVS
# Typische Meldung:
ls: CVS: Datei oder Verzeichnis nicht gefunden
# Fehler mit "update", da Verzeichnis nicht unter CVS-Verwaltung
cvs update
# Typische Meldung:
cvs update: in directory .:
cvs [update aborted]: there is no version here;
run 'cvs checkout' first
# Verzeichnis enthält File "test.cpp"
ll test.cpp
# Typische Meldung:
-rw-r--r-- 1 btm506 users 4870 Feb 10 15:06 test.cpp
# Fehler mit "add", da Verzeichnis nicht unter CVS-Verwaltung
cvs add test.cpp
# Typische Meldung:
cvs add: cannot open CVS/Entries for reading:
Datei oder Verzeichnis nicht gefunden
cvs [add aborted]: no repository
Eines der wenigen CVS-Kommandos, die funktionieren, wäre z.B.
der Befehl "cvs checkout test". Dieser legt ja auch selbst
das interne CVS-Unterverzeichnis "CVS" an.
-
Was muss ich tun, um mit CVS den neuesten Stand
eines Moduls/Projektes abzurufen?
Fazit: Die entscheidenden Kommandos sind:
Im Detail:
Nach allen einmaligen Aktionen aus
"Frage: CVS zum 1. Mal benutzen"
muss man für das CVS-Modul CGAL nur in das
lokale CVS-Modulverzeichnis $HOME/cvs-work/CGAL
wechseln, das durch einen Checkout entstanden ist.
Dann gibt man einfach
cvs update -d
ein. Dies führt einen kompletten Update aller vorhandenen
Dateien und Unterverzeichnisse des Moduls CGAL
durch. Die Option "-d" bewirkt, dass auch neue
Unterverzeichnisse und alle darin enthaltenen Dateien vom
CVS-Server mit heruntergeladen werden.
Warnung:
Solange man nichts an den lokal gespeicherten Dateien geändert
hat, kann auch keine eigene Arbeit verloren gehen.
Hat man etwas an lokal gespeicherten Dateien unterhalb des
Verzeichnisses $HOME/cvs-work/CGAL geändert, wird
auch nichts überschrieben. U.U. wird aber der
am CVS-Server gespeicherte Stand und die lokal vorhandene Datei
auf einen gemeinsamen Stand gebracht. Dies nennt man Mergen.
Gelingt dies nicht, kommt es zu sog. Konflikten.
Lokale Änderungen gehen aber nie verloren, u.U.
werden einfach nur sich widersprechende Teile vom CVS-Server
und von der lokalen Datei hintereinander mit spezieller
Markierung in die lokale Datei aufgenommen.
-
Wo ist der Vorteil zu FTP?
Das einfache Herunterladen des CVS-Moduls mit allen
Dateien/Unterverzeichnissen (wie in "Frage zu Update
von CVS-Modulen") beschrieben,
ist natürlich nicht das einzige, was CVS bieten kann.
CVS verwaltet und merkt sich nicht nur die aktuellste Fassung einer
Datei, sondern auch alle bisher entstandenen Versionen und die Unterschiede
zwischen den Versionen. Es ist daher auch in der Lage, alte Versionen
wieder aus diesen Unterschieden zu erzeugen. Zudem ist es wie FTP
netzweit erreichbar, man braucht keine Login-Berechtigung für den
CVS-Server und kann auch von daheim aus (z.B. unter Windows mit einer
offenen DFÜ-Verbindung) CVS-Kommandos ausführen.
-
Was für Dateien entstehen eigentlich lokal?
Fazit:
-
$HOME/.cvspass
-
$HOME/cvs-work
-
Unterverzeichnisse CVS
Im Detail:
-
Beim Einloggen in CVS (vgl. Frage 3 zu
"cvs login") entsteht automatisch im Homeverzeichnis die
Datei ".cvspass", die den Wert der Environment-Variable
CVSROOT (d.h. Informationen zum CVS-Server, zum
CVS-Rootverzeichnis und zum CVS-Protokoll) sowie das (schlecht)
verschlüsselte CVS-Password enthält. Diese Datei sollte
nicht gelöscht werden.
-
Man muss selbst ein lokales CVS-Arbeitsverzeichnis anlegen, am
WAP-Pool meist das Unterverzeichnis "$HOME/cvs-work"
vom Homeverzeichnis des Users (vgl. Frage 3 zum
CVS-Arbeitsverzeichnis).
-
Durch einen Checkout oder durch
rekursives Update
entsteht in jedem neu angelegten Unterverzeichnis des CVS-Moduls
das interne CVS-Verwaltungsverzeichnis "CVS",
das die Files "Entries" (enthält Unterverzeichnisse
und Dateinamen mit Versionsnummern), "Repository"
(enthält CVS-Modulnamen) und
"Root" (beinhaltet Wert der Environment-Variable
CVSROOT) enthält. Diese Files sollte man tunlichst nicht
ändern oder gar löschen.
Zusätzlich werden dadurch i.d.R.
unterhalb des lokalen CVS-Arbeitsverzeichnisses
neue Dateien und Unterverzeichnisse entstehen.
(vgl. Frage zum Checkout
und Frage zum Update).
-
Was passiert, wenn ich versehentlich lokal eine am CVS-Server
gespeicherte Datei oder ein Unterverzeichnis gelöscht habe?
Gar nichts oder nicht viel!
Kaputt gegangen oder etwas gelöscht wurde nur im lokalen
CVS-Arbeitsverzeichnis, am CVS-Server ist alles beim alten geblieben.
Im allerschlimmsten Fall hat man seine eigenen Änderungen
an Dateien des CVS-Moduls verloren, an alten Versionen oder gar an Dateien
des CVS-Moduls hat man gar nichts geändert. Im Gegenteil: Mit Hilfe
des Updates kann man sofort wieder alle Dateien und Unterverzeichnisse des
CVS-Moduls wieder herstellen.
Beispiel:
cd $HOME/cvs-work/CGAL
# versehentliches Loeschen vom Unterverzeichnis "help"
rm -rf help
# versehentliches Loeschen von Datei "ws2001_02.html"
rm ws2001_02.html
# Wiederherstellen der Datei "ws2001_02.html"
# und vom Unterverzeichnis "help"
cvs update -d
-
Wie kann ich eine vorhandene Datei in einem CVS-Modul
ändern und diese Änderung veröffentlichen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs commit
-
cvs commit <Filename(n)>
Im Detail:
Dies setzt voraus, dass die Datei schon zum CVS-Modul gehört
(ansonsten siehe neues Hinzufügen von Dateien).
(Das sind alle Dateien, die durch einen
Checkout oder durch
(rekursives) Update
vom CVS-Server heruntergeladen wurden.)
Ganz einfach irgendeinen Editor aufmachen, die Änderungen machen
und dann veröffentlichen durch das CVS-Kommando "commit".
Für das File "cvs_faq.html" in
"$HOME/cvs-work/CGAL/help" lautet der Befehl
cvs commit cvs_faq.html
wenn man bereits im Unterverzeichnis "$HOME/cvs-work/CGAL/help" ist.
Es geht dann der Editor auf (standardmäßig der Vi-Editor
bzw. der Editor, der in der
Environment-Variable CVSEDITOR) festgelegt wurde).
In dieser temporären Datei sollte man unbedingt die gemachten
Änderungen sinnvoll, aber nicht zu lang (etwa 2-10 Zeilen)
beschreiben, die Datei abspeichern und abwarten, ob das
Veröffentlichen gelingt. Im Falle des Gelingens ist man fertig,
die neue Version wurde vom CVS-Version abgespeichert. Bei
Nichtgelingen ist man im Konfliktfall (siehe spätere Fragen).
-
Wie kann ich eine neue Datei zum CVS-Modul
hinzufügen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs add
-
cvs commit
-
cvs commit <Filename(n)>
Im Detail:
Man muss zunächst durch den CVS-Befehl "add" dem CVS-Server
ankündigen, dass die neue Datei hinzugefügt werden soll.
Danach muss man diese wie in der Frage zum
Ändern von Dateien im CVS-Modul beschrieben,
veröffentlichen.
Beispiel:
Die Datei "meine_tipps.txt" soll neu zum
CVS-Modul "CGAL" im Unterverzeichnis "$HOME/cvs-work/CGAL/help" hinzugefügt
werden.
# Wechseln in das richtige Unterverzeichnis
cd $HOME/cvs-work/CGAL/help
# geplantes Hinzufuegen ankuendigen
cvs add meine_tipps.txt
# Typische Meldung:
cvs server: scheduling file `meine_tipps.txt' for addition
cvs server: use 'cvs commit' to add this file permanently
# Veroeffentlichen
cvs commit meine_tipps.txt
# Typische Meldung:
RCS file: /share/cvs-repository/CGAL/help/meine_tipps.txt,v
done
Checking in unterschrift.tex;
/share/cvs-repository/CGAL/help/meine_tipps.txt,v <-- meine_tipps.txt
initial revision: 1.1
done
Die Version von "meine_tipps.txt" wird vom CVS-Server
automatisch auf 1.1 gesetzt (und im RCS-Format abgespeichert).
-
Wie kann ich ein neues Unterverzeichnis zum
CVS-Modul hinzufügen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs add
-
cvs commit
-
cvs commit <Filename(n)>
Im Detail:
Wenn es nur um die Erstellung eines neuen Unterverzeichnisses geht,
genügt ein CVS-Befehl "add" mit dem Unterverzeichnisnamen.
Im Unterschied zum Hinzufügen von Dateien
wirkt der CVS-Befehl "add" bei Verzeichnissen sofort, muss also nicht
durch "commit" ergänzt werden.
Beispiel:
Das neue Unterverzeichnis "polygon" soll neu zum
CVS-Modul "CGAL" im Unterverzeichnis "$HOME/cvs-work/CGAL/uebung" hinzugefügt
werden.
# Wechseln in das richtige Unterverzeichnis
cd $HOME/cvs-work/CGAL/uebung
# irgendwie neues Unterverzeichnis anlegen
mkdir polygon
# Hinzufuegen des Unterverzeichnisses
cvs add polygon
# Typische Meldung:
Directory /share/cvs-repository/CGAL/uebung/polygon added to the repository
Normalerweise will man aber gleich auch mehrere Dateien
eines neuen Unterverzeichnisses hinzufügen. Dann fügt man
- wie oben beschrieben - zunächst das Unterverzeichnis zum
CVS-Modul hinzu. Dann wechselt man ins Unterverzeichnis und
fügt mit "add" einzelne Dateien zum CVS-Modul hinzu.
Diese muss man dann wieder mit "commit" einzeln veröffentlichen
(siehe Frage zum Hinzufügen von neuen Dateien).
Beispiel:
Das neue Unterverzeichnis "polygon" mit den Dateien
"erzeuge_polygon.cpp" und "Makefile" sollen neu zum
CVS-Modul "CGAL" im Unterverzeichnis "$HOME/cvs-work/CGAL/uebung" hinzugefügt
werden.
# Wechseln in das richtige Unterverzeichnis
cd $HOME/cvs-work/CGAL/uebung
# Hinzufuegen des Unterverzeichnisses
cvs add polygon
# Typische Meldung:
cvs server: scheduling file `meine_tipps.txt' for addition
cvs server: use 'cvs commit' to add this file permanently
# Wechseln ins neue Unterverzeichnis
cd polygon
# geplantes Hinzufuegen der 2 Dateien ankuendigen
cvs add erzeuge_polygon.cpp Makefile
# Typische Meldung:
cvs server: scheduling file `erzeuge_polygon.cpp' for addition
cvs server: scheduling file `Makefile' for addition
cvs server: use 'cvs commit' to add this file permanently
# Veroeffentlichen vom C++-File
cvs commit erzeuge_polygon.cpp
# Veroeffentlichen vom Makefile
cvs commit Makefile
-
Kann ich Dateien aus dem CVS-Modul löschen
oder umbenennen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs delete bzw. cvs remove
-
cvs add
-
cvs commit
-
cvs commit <Filename(n)>
Im Detail:
Im Prinzip ja, doch sollte man sehr vorsichtig vorgehen, damit
noch alte Versionen weiterhin ausgecheckt werden können.
Die unten angegebene Vorgehensweise setzt voraus, dass diese Datei
bereits zum CVS-Modul hinzugefügt worden ist.
Ausschließlich lokal vorhandene Dateien, die noch zu
keinem CVS-Modul gehören, kann man natürlich ohne
Weiteres löschen oder umbenennen!
Datei löschen aus dem CVS-Modul:
Die Datei wird zunächst aus dem lokalen CVS-Arbeitsverzeichnis
gelöscht. Dann wird das Löschen aus dem CVS-Modul
angekündigt mit dem CVS-Befehl "remove"/"delete".
Danach veröffentlicht man das Löschen mit dem
CVS-Befehl "commit".
Achtung! Alle Versionen der Datei kann man trotzdem noch
aus dem CVS-Verzeichnis abrufen, nur gehört die Datei nicht mehr
zur aktuellsten Fassung des CVS-Moduls!
Beispiel: Löschen von "unsinn.cpp" (soll bereits
zum CVS-Modul hinzugefuegt worden sein) aus dem CVS-Modul "test"
# Wechseln in das lokale Arbeitsverzeichnis fuer das CVS-Modul "test"
cd $HOME/cvs-work/test
# irgendwie Loeschen von "unsinn.cpp" aus lokalem Arbeitsverzeichnis
rm unsinn.cpp
# angekuendigtes Loeschen von "unsinn.cpp" aus CVS-Modul
# erst NACH tatsaechlichem Loeschen eingeben!
cvs remove unsinn.cpp
# Typische Meldung:
cvs server: scheduling `unsinn.cpp' for removal
cvs server: use 'cvs commit' to remove this file permanently
# Veroeffentlichen des Loeschens
# unbedingt: Loeschen des Files im CVS-Kommentar erwaehnen!
cvs commit unsinn.cpp
# Typische Meldung:
Removing unsinn.cpp;
/share/cvs-repository/test/unsinn.cpp,v <-- unsinn.cpp
new revision: delete; previous revision: 1.1
done
# nochmal Logmeldungen ansehen
cvs log unsinn.cpp
# Typische Meldung:
# vgl. Version 1.2 (Status: dead!)
RCS file: /share/cvs-repository/test/Attic/unsinn.cpp,v
Working file: unsinn.cpp
...
revision 1.2
date: 2001/10/29 10:24:23; author: robert; state: dead; lines: +0 -0
Loeschen der C++-Datei aus CVS-Modul mit "cvs remove unsinn.cpp"
und "cvs commit unsinn.cpp"
revision 1.1
date: 2001/10/29 10:21:57; author: robert; state: Exp;
neues C++-File zur spaeteren Demonstration des Loeschens
Datei umbennen im CVS-Modul:
Das Vorgehen ähnelt stark dem oben beschriebenen Löschen.
Die Datei wird zunächst im lokalen CVS-Arbeitsverzeichnis
umbenannt. Dann wird das Löschen aus dem CVS-Modul
mit dem alten Dateinamen und die Aufnahme in das CVS-Modul mit
dem neuen Dateinamen angekündigt mit den CVS-Befehlen
"remove"/"delete" und "add".
Danach veröffentlicht man das Löschen und das Hinzufügen
mit dem CVS-Befehl "commit".
Achtung! Alle bisherigen CVS-Informationen der Datei kann man
trotzdem noch mit dem alten Dateinamen aus dem CVS-Verzeichnis
abrufen, nur alle neu gemachten Änderungen erfährt man
nur mehr über den neuen Dateinamen.
Beispiel: Umbenennen von Datei "alter_name.txt"
(soll bereits zum CVS-Modul hinzugefuegt worden sein) in
"neuer_name.txt" im CVS-Modul "test"
# Wechseln in das lokale Arbeitsverzeichnis fuer das CVS-Modul "test"
cd $HOME/cvs-work/test
# irgendwie Umbenennen von "alter_name.txt" in "neuer_name.txt"
# im lokalem Arbeitsverzeichnis
mv alter_name.txt neuer_name.txt
# angekuendigtes Loeschen von "alter_name.txt" aus CVS-Modul
# erst NACH tatsaechlichem Umbenennen eingeben!
cvs remove alter_name.txt
# angekuendigte Aufnahme von "neuer_name.txt" in das CVS-Modul
# erst NACH tatsaechlichem Umbenennen eingeben!
cvs add neuer_name.txt
# (gemeinsames) Veroeffentlichen des Loeschens und der Aufnahme
# (auch getrennt voneinander moeglich)
# unbedingt: Umbenennung des Files im CVS-Kommentar erwaehnen!
cvs commit alter_name.txt neuer_name.txt
-
Kann ich Unterverzeichnisse aus dem CVS-Modul löschen
oder umbenennen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs delete bzw. cvs remove
-
cvs add
-
cvs commit
-
cvs commit <Filename(n)>
-
cvs update -P
Im Detail:
Im Prinzip ja, doch sollte man noch vorsichtiger vorgehen, als
bei der Frage zum Löschen/Umbenennen von Files
im CVS-Modul beschrieben, damit
noch alte Versionen weiterhin ausgecheckt werden können.
Die unten angegebene Vorgehensweise setzt voraus, dass das
Unterverzeichnis bereits zum CVS-Modul hinzugefügt worden ist.
Ausschließlich lokal vorhandene Unterverzeichnisse, die
noch zu keinem CVS-Modul gehören, kann man natürlich
ohne Weiteres löschen oder umbenennen!
Unterverzeichnis löschen aus dem CVS-Modul:
Zunächst sollte man alle aus dem Unterverzeichnis zum CVS-Modul
gehörenden Files wie in
Frage zum Löschen/Umbenennen von Files
im CVS-Modul beschrieben löschen.
Dann wird der Rest der Files aus dem Unterverzeichnis und das
Unterverzeichnis selbst im lokalen CVS-Arbeitsverzeichnis gelöscht.
Es gibt keinen CVS-Befehl zum Löschen von Unterverzeichnissen
aus dem CVS-Modul! Um zu verhindern, dass das nächste Update
automatisch das (dann leere) Unterverzeichnis wieder anlegt,
verwende man bei Checkout oder
Update zusätzlich die Option "-P".
Dies verhindert das Anlegen von leeren Unterverzeichnissen.
Will man ein (anderes) leeres Unterverzeichnis bei
Checkout oder Update
angelegt wissen, muss man mindestens ein (Dummy-)File darin aufnehmen,
z.B. ein (leeres) File ".keepme".
Achtung! Alle Versionen aller in CVS im nunmehr gelöschten
Unterverzeichnis verwalteten Dateien kann man trotzdem noch aus dem
CVS-Verzeichnis abrufen, nur gehört das Unterverzeichnis
nicht mehr zur aktuellsten Fassung des CVS-Moduls!
Beispiel: Löschen vom Unterverzeichnis "save"
mit den Files "unsinn.cpp" und "neuer_name.txt"
(sollen bereits zum CVS-Modul hinzugefuegt worden sein) aus dem
CVS-Modul "test"
# Wechseln in das lokale Arbeitsverzeichnis fuer das CVS-Modul "test"
cd $HOME/cvs-work/test/save
# irgendwie Loeschen aller zum CVS-Modul gehörenden Dateien
# im Unterverzeichnis "save"
rm neuer_name.txt unsinn.cpp
# angekuendigtes Loeschen dieser Dateien aus CVS-Modul
# erst NACH tatsaechlichem Loeschen eingeben!
cvs remove neuer_name.txt unsinn.cpp
# Veroeffentlichen des Loeschens
# unbedingt: Loeschen des Files im CVS-Kommentar erwaehnen!
cvs commit neuer_name.txt unsinn.cpp
# Update mit Option "-P" loescht leeres Unterverzeichnis "save"
cd ..
cvs update -P
# Update mit Option "-d" erzeugt leeres Unterverzeichnis "save"
# wieder! Das wuerde bei "cvs update -d -P" nicht passieren!
cvs update -d
Unterverzeichnis umbennen im CVS-Modul:
Das Vorgehen ähnelt stark dem oben beschriebenen Löschen.
Zunächst werden alle Dateien des alten Unterverzeichnisses
in ein neu erstelltes Unterverzeichnis mit dem neuen Namen
(für das alte Unterverzeichnis) im lokalen CVS-Arbeitsverzeichnis
verschoben. Dann wird das Löschen aller Files aus dem CVS-Modul
unter dem alten Unterverzeichnisnamen sowie die Aufnahme aller
verschobenen Files mit dem neuen Unterverzeichnisnamen
angekündigt mit den CVS-Befehlen
"remove"/"delete" und "add".
Danach veröffentlicht man das Löschen und das Hinzufügen
mit dem CVS-Befehl "commit".
Achtung! Alle Versionen aller in CVS im nunmehr umbenannten
Unterverzeichnis verwalteten Dateien kann man trotzdem noch aus dem
CVS-Verzeichnis abrufen unter dem alten Unterverzeichnis, nur
gehört das Unterverzeichnis mit dem alten Namen
nicht mehr zur aktuellsten Fassung des CVS-Moduls! Die aktuellen
Änderungen erfährt man nur mehr im Unterverzeichnis mit dem
neuen Namen.
Beispiel: Umbenennen vom Unterverzeichnis "sicherung"
mit den Files "unsinn.cpp" und "neuer_name.txt"
(sollen bereits zum CVS-Modul hinzugefuegt worden sein) in den
neuen Namen CVS-Modul "save"
# Wechseln in das lokale Arbeitsverzeichnis fuer das CVS-Modul "test"
cd $HOME/cvs-work/test
# irgendwie Erstellen des neuen Unterverzeichnisses "save"
# und Hinzufuegen zum CVS-Modul
mkdir save
cvs add save
# einzelnes Verschieben der relevanten Files "unsinn.cpp" und
# "neuer_name.txt" im das neue Unterverzeichnis "sicherung"
mv sicherung/unsinn.cpp save
mv sicherung/neuer_name.txt save
# angekuendigtes Loeschen der 2 Dateien aus altem Unterverzeichnis
# "sicherung"
# erst NACH tatsaechlichem Verschieben eingeben!
cvs remove sicherung/unsinn.cpp sicherung/neuer_name.txt
# angekuendigte Aufnahme der 2 verschobenen Dateien zum
# neuen Unterverzeichnis "save"
# erst NACH tatsaechlichem Umbenennen eingeben!
cvs add save/neuer_name.txt save/unsinn.cpp
# (gemeinsames) Veroeffentlichen des Loeschens und der Aufnahme
# (auch getrennt voneinander moeglich)
# unbedingt: Umbenennung der Unterverzeichnisse im CVS-Kommentar erwaehnen!
cvs commit sicherung/unsinn.cpp sicherung/neuer_name.txt \
save/neuer_name.txt save/unsinn.cpp
# Update mit Option "-P" loescht leeres Unterverzeichnis "sicherung"
cvs update -P
# Update mit Option "-r" erzeugt leeres Unterverzeichnis "sicherung"
# wieder! Das wuerde bei "cvs update -d -P" nicht passieren!
cvs update -d
-
Warum muss ich vorher "cvs add" bei Dateien
machen, wenn ich nachher sowieso noch "cvs commit"
eingeben muss?
a) Den Befehl "cvs commit" kann man entweder mit einem Filenamen
ergänzen (um eine Veröffentlichung und Kommentierung
eines Files durchzuführen) oder aber ohne Filenamen
aufrufen. In letzterem Fall werden nicht alle lokalen Dateien
veröffentlicht (wäre nicht wünschenswert, sonst würden
u.U. auch von manchen Editoren automatisch erzeugte Backup-Kopien von
Dateien mitveröffentlicht oder noch unfertige Dateien), sondern nur
die Dateien, die mit "cvs add" als zur Veröffentlichung
geplant eingestuft worden sind bzw. die Files, die schon zum CVS-Modul
gehören und sich lokal geändert haben.
"cvs add" dient also zur besseren Einstufung für CVS,
was durch ein allgemeines "cvs commit" veröffentlicht
werden soll und was nicht.
b) Das Entfernen einer Datei aus dem CVS-Modul geht auch nur durch
den Befehl "cvs remove" mit folgendem Dateinamen und
einem anschließenden "cvs commit". Das soll (wie beim
Hinzufügen auch) ein voreiliges Löschen aus dem CVS-Modul
verhindern. Es ist also eine Art Sicherheitsstufe. Dieses
"zusätzliche Hindernis" (erst "cvs add" einer Datei vor
einem "cvs commit") vor der Veröffentlichung entfällt,
sobald die Datei zum CVS-Modul gehört.
-
Kann ich CVS von daheim aus so verwenden, dass ich meine
Änderungen von daheim aus an den CVS-Server schicken kann?
Natürlich! CVS ist weltweit zu benutzen (solange der CVS-Server
nicht den Zugriff einschränkt).
Wenn man unter Linux arbeitet, sollte man das CVS-Paket
installieren (falls nicht bereits installiert), unter Windows sollte
man eine Windows-Version von CVS installieren, vgl.
Frage 4 "Gibt es CVS auch unter Windows?".
Nach der Installation muss man die installierte CVS-Version
konfigurieren, also Environment-Variablen setzen bzw. für WinCVS
entsprechende Voreinstellungen (Name des CVS-Servers, Protokoll,
Verzeichnis des CVS-Repositories, ...) im Client setzen,
vgl. Frage 5 "Was muss ich beim ersten Mal beachten,
wenn ich CVS nutzen will?".
Bevor man aber mit CVS daheim arbeitet und z.B. einen
Checkout oder ein (rekursives)
Update durchführen will, muss man vorher per Hand
eine Internetverbindung (DFÜ-Verbindung) per Modem/ISDN/sonstwie
starten (kann eine Einwahl über Uni@Home an die Universität
Bayreuth sein oder per Call-by-Call mit einem Internet-Provider
oder über einen festen Internet-Provider wie T-Online, AOL, ...).
Diese kann man wieder beenden, wenn das Checkout/der Update
beendet sind.
Vorsicht: Bevor man aber die Änderungen veröffentlicht,
muss man die Internetverbindung wieder aufbauen.
CVS kontaktiert häufig den CVS-Server, z.B. auch bei den Kommandos
"cvs diff", "cvs log" und "cvs status",
so dass dann immer die Internetverbindung wieder hergestellt werden
muss.
-
Kann man beim ersten Mal nur einen Teil des CVS-Moduls
übertragen?
Das erste Mal werden durch einen Checkout
alle Dateien des CVS-Moduls übertragen, so dass u.U. bei einer
langsamen Internetverbindung von daheim aus die Übertragung
eine zu lange Zeit in Anspruch nimmt. Daher kann ein vorzeitiges
Abbrechen wünschenswert sein.
Versuche unter Linux haben gezeigt, dass man ein
Checkout jederzeit mit CTRL-C abbrechen kann.
Dann wird die Übertragung der restlichen Dateien nicht mehr
durchgeführt. Es kann dann aber später jederzeit nochmals
ein Checkout durchgeführt werden, das dann
den Rest der Dateien des CVS-Moduls überträgt.
Unter Windows ist Vergleichbares zu erwarten. Es ist ja gerade die
Aufgabe eines Checkouts, den Stand des CVS-Moduls
auf den lokalen Rechner zu bringen. Ist der lokale Stand
unvollständig, wird er automatisch ergänzt.
Hier sind aber Erfahrungen der Übungsteilnehmer willkommen!
-
Wie komme ich an alte Versionen?
Fazit: Die entscheidenden Kommandos sind:
-
cvs log
-
cvs log -s dead -R
-
cvs update -r <Version> -p
-
cvs status
-
cvs update -A
Im Detail:
a) Zuerst einmal den leichteren Fall:
Die Datei ist noch im CVS-Modul und ist nicht mit
"cvs remove" und "cvs commit" entfernt worden.
Zunächst sollte man sich mit "cvs log" anhand der
Kommentare zu den Versionen die Version aussuchen, die man
abrufen will.
Beispiel:
cd ~/cvs-work/test
cvs log version.txt
# typische Ausgabe:
RCS file: /share/cvs-repository/test/version.txt,v
Working file: version.txt
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 3; selected revisions: 3
description:
----------------------------
revision 1.3
date: 2001/11/06 13:47:38; author: robert; state: Exp; lines: +2 -1
brandneu statt neu (7. Zeile)
neue Zeile 7b
----------------------------
revision 1.2
date: 2001/10/31 16:39:25; author: robert; state: Exp; lines: +3 -0
2. Version: vgl. File "version_neu.txt.01"
erzeugt durch die Befehle
"cp version_neu.txt.01 version.txt"
und
"cvs commit version.txt"
----------------------------
revision 1.1
date: 2001/10/31 16:33:44; author: robert; state: Exp;
1. Version: vgl. File "version_alt.txt.01"
=============================================================================
Man entscheidet sich, die Version 1.1 abzurufen. Will man diese
nicht wieder einchecken, sondern ist nur am Inhalt interessiert,
kann man diese Version am Bildschirm ausgeben.
# Ausgabe am Bildschirm
cvs update -r1.1 -p version.txt
# typische Ausgabe:
===================================================================
Checking out version.txt
RCS: /share/cvs-repository/test/version.txt,v
VERS: 1.1
***************
1. Zeile
2. Zeile
3. Zeile
4. Zeile
5. Zeile
6. Zeile
Alles nach "***************" und vor obigen Leerzeilen gehört
zur Version 1.1.
Mit dem Befehl
cvs update -r1.1 -p version.txt > version_start.txt
ruft man die Version 1.1 ab und lenkt die Ausgabe um in das
neu erstellte File "version_start.txt", das die Version 1.1
von "version.txt" enthält.
In beiden Fällen kann man das File "version.txt"
jederzeit ändern und mit der neuesten Version wieder
veröffentlichen. Der Abruf der alten Version stört dabei
nicht.
b) Jetzt der schwierigere Fall:
Die Datei war im CVS-Modul, ist aber mit
"cvs remove" und "cvs commit" entfernt worden.
Zunächst sollte man sich mit "cvs log" und dem
Dateinamen die Versionsgeschichte ansehen,
um anhand der Kommentare zu den Versionen die Version aussuchen, die man
abrufen will (normalerweise die vorletzte, da die letzte die Version
ist, die den Zustand "dead" erhalten hat).
Beispiel:
# Hinzufuegen planen und Veroeffentlichen der 1. Version
cvs add hokus_pokus.txt
cvs commit hokus_pokus.txt
# spaeter: Loeschen im lokalen CVS-Arbeitsverzeichnis
rm hokus_pokus.txt
# Loeschen planen und bestaetigendes Loeschen aus CVS-Modul
cvs remove hokus_pokus.txt
cvs commit hokus_pokus.txt
# typische Meldung:
Removing hokus_pokus.txt;
/share/cvs-repository/test/hokus_pokus.txt,v <-- hokus_pokus.txt
new revision: delete; previous revision: 1.1
done
# Log-Informationen abrufbar, obwohl Datei nicht mehr im lokalen
# CVS-Arbeitsverzeichnis!
cvs log hokus_pokus.txt
# typische Meldung:
RCS file: /share/cvs-repository/test/Attic/hokus_pokus.txt,v
Working file: hokus_pokus.txt
head: 1.2
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2; selected revisions: 2
description:
----------------------------
date: 2001/11/07 14:14:28; author: robert; state: dead; lines: +0 -0
2. Schritt: Entfernen aus CVS-Modul
rm hokus_pokus.txt
cvs remove hokus_pokus.txt
----------------------------
revision 1.1
date: 2001/11/07 14:13:49; author: robert; state: Exp;
File zum Ausprobieren von Aufnahme, Loeschen und Wiederaufnahme in
CVS-Modul
1. Schritt: Aufnahme mit "cvs add" und "cvs commit"
=============================================================================
Es fällt auf, dass der Zustand in Version 1.2 als "dead"
gekennzeichnet ist und dass das RCS-File im Unterverzeichnis
"Attic" am CVS-Server im zum Modul passenden Unterverzeichnis des
CVS-Repositories gelandet ist. Jedes "cvs update" ignoriert daher
diese Datei und erstellt es nicht mehr neu!
Eine Wiederaufnahme kann wie prinzipiell wie folgt erfolgen:
Zuerst die letzte Version ermitteln vor der Version, die
den Zustand "dead" hat (normalerweise: die vorletzte).
Diese mit "cvs update" und der Option "-rVersionsnummer"
abrufen, das File aber sofort temporär umbenennen.
Dann ein sog. "sticky tag" löschen (also die Information, dass
der Update eine alte Version abgerufen hat) und mit
"cvs add" wieder aufnehmen. Erst dann das File
wieder zurück umbenennen und es mit "cvs commit"
wieder veröffentlichen.
detailliertes Vorgehen mit vielen Status-Abfragen:
# Log-Informationen abrufen
cvs log hokus_pokus.txt
# --> nach letzter Version suchen, die noch nicht den Zustand "dead"
# hat (normalerweise die vorletzte; hier: Version 1.1 mit
# Zustand "Exp")
cvs update -r1.1 hokus_pokus.txt
# Log-Informationen zeigen noch Zustand "dead" und RCS-File im
# Attic-Unterverzeichnis
cvs log hokus_pokus.txt
# Statusanfrage meldet Zustand "Up-to-date"
cvs status hokus_pokus.txt
# typische Ausgabe:
===================================================================
File: hokus_pokus.txt Status: Up-to-date
Working revision: 1.1
Repository revision: 1.1 /share/cvs-repository/test/Attic/hokus_pokus.txt,v
Sticky Tag: 1.1
Sticky Date: (none)
Sticky Options: (none)
# kurzzeitiges (wichtiges) Umbenennen
mv hokus_pokus.txt hokus_pokus.txt.temp
# Statusanfrage meldet Zustand "Needs Checkout"
cvs status hokus_pokus.txt
# typische Ausgabe:
===================================================================
File: no file hokus_pokus.txt Status: Needs Checkout
Working revision: 1.1
Repository revision: 1.1 /share/cvs-repository/test/Attic/hokus_pokus.txt,v
Sticky Tag: 1.1
Sticky Date: (none)
Sticky Options: (none)
# Zuruecksetzen der "sticky flags" durch Option "-A"
# noetig, da CVS denkt, dass die Version 1.2 noch aktuell ist
# (spaetestens jetzt wuerde ohne vorangegangenes Umbenennen
# die Datei von CVS geloescht werden)
cvs update -A hokus_pokus.txt
# typische Ausgabe:
cvs server: warning: hokus_pokus.txt is not (any longer) pertinent
# Statusanfrage meldet Zustand "Up-to-date", Version ist 1.2!
# Das "sticky tag" mit Wert 1.1 tritt nicht mehr auf!
cvs status hokus_pokus.txt
# typische Ausgabe:
===================================================================
File: no file hokus_pokus.txt Status: Up-to-date
Working revision: No entry for hokus_pokus.txt
Repository revision: 1.2 /share/cvs-repository/test/Attic/hokus_pokus.txt,v
# Wiederhinzufuegen der Datei (die lokal noch "hokus_pokus.txt.temp" heisst)
cvs add hokus_pokus.txt
# typische Ausgabe:
cvs server: re-adding file hokus_pokus.txt (in place of dead revision 1.2)
cvs server: use 'cvs commit' to add this file permanently
# Statusanfrage meldet Zustand "Entry Invalid", Version ist aber 1.2!
cvs status hokus_pokus.txt
# typische Ausgabe:
cvs server: warning: new-born hokus_pokus.txt has disappeared
===================================================================
File: no file hokus_pokus.txt Status: Entry Invalid
Working revision: New file!
Repository revision: 1.2 /share/cvs-repository/test/Attic/hokus_pokus.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
# Umbenennen:
mv hokus_pokus.txt.temp hokus_pokus.txt
# Statusanfrage meldet Zustand "Locally Added", Version ist aber 1.2!
cvs status hokus_pokus.txt
# typische Ausgabe:
===================================================================
File: hokus_pokus.txt Status: Locally Added
Working revision: New file!
Repository revision: 1.2 /share/cvs-repository/test/Attic/hokus_pokus.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
# Veroeffentlichen als neue Version 1.3
cvs commit hokus_pokus.txt
# typische Ausgabe:
Checking in hokus_pokus.txt;
/share/cvs-repository/test/hokus_pokus.txt,v <-- hokus_pokus.txt
new revision: 1.1; previous revision: 1.2
done
# Statusanfrage meldet Zustand "Up-to-date", Version ist 1.3
# und das RCS-File ist aus dem Untervrzeichnis "Attic" in das
# uebergeordnete Verzeichnis verschoben worden!
cvs status hokus_pokus.txt
# typische Ausgabe:
===================================================================
File: hokus_pokus.txt Status: Up-to-date
Working revision: 1.3
Repository revision: 1.3 /share/cvs-repository/test/hokus_pokus.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Kennt man gar nicht mehr den Dateinamen, hilft auch kein
"cvs update" mehr, da diese Datei nicht mehr zum CVS-Modul
gehört. Dann kann man
# Abfrage nach allen Dateien im CVS-Modul, die den Zustand "dead" haben
# (Option "-s dead"), Ausgabe nur der RCS-Filenamen (Option "-R")
cvs log -s dead -R
# typische Ausgabe:
# leider werden alle Dateien (auch die mit Zustand "Exp") ausgegeben !?!
cvs server: Logging .
/share/cvs-repository/test/Attic/Brandneu.txt,v
/share/cvs-repository/test/CgalOnWin.htm,v
/share/cvs-repository/test/CgalOnWinCygWin.htm,v
/share/cvs-repository/test/Attic/Test.txt,v
/share/cvs-repository/test/Test_r1.6.txt,v
/share/cvs-repository/test/alter_name.txt,v
/share/cvs-repository/test/Attic/hokus_pokus.txt,v
/share/cvs-repository/test/Attic/neuer_name.txt,v
/share/cvs-repository/test/test.html,v
...
Aus dieser Liste schaut man sich alle an, deren RCS-Files
im Unterverzeichnis "Attic" gelandet sind. Das sind dann die
aus dem CVS-Modul gelöschten Files (hier:
"Brandneu.txt", "Test.txt", "hokus_pokus.txt", "neuer_name.txt").
So erfährt man die Namen der bereits gelöschten Dateien
aus dem CVS-Modul.
Eine Wiederaufnahme kann man auch am CVS-Server (mit Root-Rechten)
erreichen (Achtung: u.U. nicht ungefährlich!).
Beispiel:
cd /share/cvs-repository/test
# Verschieben aus Unterverzeichnis "Attic" in Modulverzeichnis
# (zur Demonstration des Unterschieds wird hier kopiert)
cp Attic/hokus_pokus.txt,v .
# Ändern des Zustands "dead" der letzten Version im Editor
# in den Zustand "Exp" (Log-Meldung mit dem Löschen bleibt
# ehalten)
vi hokus_pokus.txt,v
...
diff hokus_pokus.txt,v Attic
# typische Ausgabe:
13c13
< date 2003.03.18.10.49.52; author robert; state Exp;
---
> date 2003.03.18.10.49.52; author robert; state dead;
# gefahrloses Löschen möglich
# (zur Demonstration des Unterschieds wird das erst jetzt gemacht)
rm Attic/hokus_pokus.txt,v
Ein "cvs update hokus_pokus.txt" auf Client-Seite lässt
das File wieder erscheinen (die Version, die vorher zum Löschen
entstanden ist, ist jetzt die aktuellste Version).
-
Was muss ich tun, damit ich später einmal eine ältere
Version meines Moduls/Unterverzeichnisses abrufen kann?
Diese Frage ist etwas weitergehend als die Frage
zu den alten Versionen. Solange man nur an alte Versionen
einiger weniger Dateien herankommen muss, kann man diese wie in der
Antwort zur Frage zu den alten Versionen
abrufen. Es gibt allerdings auch einen eleganteren Weg, der auch
für sehr viele Dateien funktioniert. Dieser setzt
allerdings voraus, dass man vor dem Eintreten dieses Wunsches
symbolische Bezeichnungen für eine Version aller Dateien des
Programmpakets gesetzt hat. Man erreicht dies durch das CVS-Kommando
"rtag" (nicht zu verwechseln mit dem CVS-Kommando
"tag"!). Dieses gibt den aktuellen Versionen aller Dateien
eines CVS-Moduls oder eines Unterverzeichnisses eine symbolische
Versionsbezeichnung. Diese kann man sich, nebenbei bemerkt, auch
besser merken, als die evtl. unterschiedlichen Versionsnummern
verschiedener (vieler) Dateien.
Danach kann man ggf. mit dem CVS-Kommando "export" eine
ältere Version eines CVS-Moduls (oder eines Unterverzeichnisses)
abrufen und (normalerweise) in ein neues Unterverzeichnis abspeichern.
Fazit: Die entscheidenden Kommandos sind:
-
cvs status -v
-
cvs rtag
-
cvs update -r <Version> -p
-
cvs export -r <Version> -d
<Unterverzeichnis>
Beispiel:
cd ~/cvs-work/test
cvs update -dP
cd work
# Das File hat noch keine symbolische Versionsnummer
cvs status -v File.txt
# typische Ausgabe:
===================================================================
File: File.txt Status: Up-to-date
Working revision: 1.1
Repository revision: 1.1 /share/cvs-repository/test/work/File.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
No Tags Exist
# als Startversion "start" kennzeichnen (nur im Unterverzeichnis work
# vom Modul "test"
cvs rtag start test/work
# Typische Meldung:
cvs server: Tagging test/work
# File hat symbolische Versionsnummer "start", die auf Version 1.1
# verweist
cvs status -v File.txt
# typische Ausgabe:
===================================================================
File: File.txt Status: Up-to-date
Working revision: 1.1
Repository revision: 1.1 /share/cvs-repository/test/work/File.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
start (revision: 1.1)
# in der Zwischenzeit neue Versionen erzeugen
# (Version 1.4 fuer "File.txt" und 1.2 fuer "Weiteres_File.txt"
...
# momentanen Stand des Unterverzeichnisses als Version "version-1"
# kennzeichnen
cvs rtag version-1 test/work
# Typische Meldung:
cvs server: Tagging test/work
# File "File.txt" hat symbolische Versionsnummer "version-1",
# die auf Version 1.4 verweist
cvs status -v File.txt
# typische Ausgabe:
===================================================================
File: File.txt Status: Up-to-date
Working revision: 1.4
Repository revision: 1.4 /share/cvs-repository/test/work/File.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
version-1 (revision: 1.4)
start (revision: 1.1)
# File "Weiteres_File.txt" hat symbolische Versionsnummer "version-1",
# die auf Version 1.2 verweist
cvs status -v Weiteres_File.txt
# typische Ausgabe:
===================================================================
File: File.txt Status: Up-to-date
Working revision: 1.2
Repository revision: 1.2 /share/cvs-repository/test/work/Weiteres_File.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
version-1 (revision: 1.2)
start (revision: 1.1)
Der Anfangsstand ist also der symbolischen Version "start"
zugeordnet, die 1. Version der symbolischen Version "version-1".
Muss man auf alte Versionen zugreifen, kann man für einzelne
Files durch "cvs update" mit dem symbolischen Versionsnamen
alte Versionen abrufen.
Beispiel:
# das File "File_start.txt" enthält die Version "start"
# (also die Version 1.1) vom File "File.txt";
# das aktuelle lokale File "File.txt" wird nicht überschrieben
cvs update -r start -p File.txt > File_start.txt
# typische Ausgabe:
===================================================================
Checking out File.txt
RCS: /share/cvs-repository/test/work/File.txt,v
VERS: 1.1
***************
# das File "File_v1.txt" enthält die Version "version-1"
# (also die Version 1.4) vom File "File.txt";
cvs update -r version-1 -p File.txt > File_v1.txt
# typische Ausgabe:
===================================================================
Checking out File.txt
RCS: /share/cvs-repository/test/work/File.txt,v
VERS: 1.4
***************
# das File "Weiteres_File_v1.txt" enthält die Version "version-1"
# (also die Version 1.4) vom File "Weiteres_File.txt";
cvs update -r version-1 -p Weiteres_File.txt > Weiteres_File_v1.txt
# typische Ausgabe:
===================================================================
Checking out Weiteres_File.txt
RCS: /share/cvs-repository/test/work/Weiteres_File.txt,v
VERS: 1.2
***************
Man kann aber auch durch "cvs export" in ein ggf. neu
zu erstellendes Unterverzeichnis alle Dateien des Moduls oder
eines Unterverzeichnisses mit derselben symbolischen Versionsnummer
abrufen.
Beispiel:
cd $HOME/cvs-work/test/work
# Abspeichern der Version "start" im Unterverzeichnis "rel-0"
cvs export -r start -d rel-0 test/work
# Typische Meldung:
cvs export: Updating rel-0
U rel-0/Altes_File.txt
U rel-0/File.txt
U rel-0/Neues_Tag.txt
U rel-0/Neues_Tag2.txt
U rel-0/Weiteres_File.txt
# Abspeichern der Version "version-1" im Unterverzeichnis "rel-1"
cvs export -r start -d version-1 test/work
# Typische Meldung:
cvs export: Updating rel-1
U rel-1/Altes_File.txt
U rel-1/File.txt
U rel-1/Neues_Tag.txt
U rel-1/Neues_Tag2.txt
U rel-1/Weiteres_File.txt
-
Was passiert, wenn man eine Datei aus dem Modul entfernt und
eine ganz andere mit demselben Namen in das Modul einfügen will?
Fazit: Die entscheidenden Kommandos sind:
-
cvs log
-
cvs status
-
cvs add
-
cvs commit
Im Detail:
Das ganze geht, ist aber nicht ganz unproblematisch, weil zwei
verschiedene Sachen unter einem Filenamen verwaltet werden, was
bei verschiedenen Versionen zur Verwirrung führen kann.
Beispiel:
Das File "uralt.txt" wurde zum CVS-Modul
hinzugefügt, dann aber gelöscht.
cvs add uralt.txt
cvs commit uralt.txt
cvs stat uralt.txt
# typische Ausgabe:
===================================================================
File: uralt.txt Status: Up-to-date
Working revision: 1.1
Repository revision: 1.1 /share/cvs-repository/test/uralt.txt,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
cvs log uralt.txt
# typische Ausgabe:
RCS file: /share/cvs-repository/test/uralt.txt,v
Working file: uralt.txt
head: 1.1
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 1; selected revisions: 1
description:
----------------------------
revision 1.1
date: 2002/05/21 08:48:37; author: robert; state: Exp;
Testfile fuer Loeschen und Wiedereinchecken eines anderen Files unter
demselben Namen
=============================================================================
# Loeschen des Files lokal
rm uralt.txt
# Loeschen des Files im CVS-Modul
cvs delete uralt.txt
cvs commit uralt.txt
# typische Ausgabe:
Removing uralt.txt;
/share/cvs-repository/test/uralt.txt,v <-- uralt.txt
new revision: delete; previous revision: 1.1
done
# probeweise "cvs log":
cvs log uralt.txt
# typische Ausgabe, siehe RCS file und Unterverzeichnis "Attic"
# sowie "state" (Zustand) "dead" in Version 1.2
RCS file: /share/cvs-repository/test/Attic/uralt.txt,v
Working file: uralt.txt
head: 1.2
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2; selected revisions: 2
description:
----------------------------
revision 1.2
date: 2002/05/21 08:54:31; author: robert; state: dead; lines: +0 -0
Loeschen des Files aus dem CVS-Modul mit
rm uralt.txt
cvs delete uralt.txt
cvs commit uralt.txt
----------------------------
revision 1.1
date: 2002/05/21 08:48:37; author: robert; state: Exp;
...
# probeweise "cvs stat":
cvs stat uralt.txt
# typische Ausgabe, siehe Filename und Unterverzeichnis "Attic"
# sowie "state" (Zustand) "dead" in Version 1.2
===================================================================
File: no file uralt.txt Status: Up-to-date
Working revision: No entry for uralt.txt
Repository revision: 1.2 /share/cvs-repository/test/Attic/uralt.txt,v
# liefert nicht das File "uralt.txt" in Version 1.2, sondern gar nichts!
cvs update
# auch das geht nicht ...
cvs update uralt.txt
Fügt man jetzt versehentlich ein neues File unter dem alten
Dateinamen hinzu, der noch dazu als gelöscht markiert ist im
CVS-Modul, geht das prinzipiell. Allerdings sollte man das besser
vermeiden, es kommt nur ein Hinweis auf Wiederaufnahme eines alten
Files ("re-adding") und die tote Version ("dead revision").
Beispiel:
mv neues_file.txt uralt.txt
# scheitert, da "uralt.txt" aus CVS-Modul geloescht wurde
cvs commit uralt.txt
cvs add uralt.txt
# typische Ausgabe, man erkennt an "re-adding" und "dead revision"
# schon das Problem:
cvs server: re-adding file uralt.txt (in place of dead revision 1.2)
cvs server: use 'cvs commit' to add this file permanently
# bei "cvs log" kommt wieder der Hinweise auf tote Version 1.2
cvs log uralt.txt
-
Wie kann man selbst auf einem Linux-Rechner einen CVS-Server
etablieren?
Erklärung fehlt noch ...
-
Wie kann man ein binäres File mit CVS verwalten?
Fazit: Die entscheidenden Kommandos sind:
-
cvs add -k 'b'
-
cvs log
-
cvs status
Im Detail:
Es gibt zwei Wege: Erstens die Methode, alles selbst zu regeln
(ohne des CVS-Administrator) und zweitens die Methode, den
CVS-Administrator mit einzuschalten.
a) alles selbst regeln
In diesem Fall muss man beim Hinzufügen der Datei zum
Repositorymodul eine Option mit angeben (genauer: eine
RCS-Option übergeben), die das File als Binärfile
kennzeichnet.
Beispiel:
cvs add -k 'b' binaer_file.txt.gz
# oder alternativ:
# cvs add -kb binaer_file.txt.gz
# Kontrolle mit "cvs status": Sticky Option "-kb" weist auf Binaerfile hin
cvs status binaer_file.txt.gz
===================================================================
File: binaer_file.txt.gz Status: Locally Added
Working revision: New file!
Repository revision: No revision control file
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: -kb
# danach Arbeiten wie ueblich
cvs commit binaer_file.txt.gz
# Kontrolle mit "cvs log":
# "keyword substitution" auf "b" weist auf Binaerfile hin
cvs log binaer_file.txt.gz
===================================================================
RCS file: /share/cvs-repository/test/binaer_file.txt.gz,v
Working file: binaer_file.txt.gz
head: 1.1
branch:
locks: strict
access list:
symbolic names:
keyword substitution: b
total revisions: 1; selected revisions: 1
...
b) mit dem CVS-Administrator prinzipiell regeln
Der CVS-Administrator kann prinzipiell Dateien mit vorgegebener
Endung zu Binärfiles für alle CVS-Benutzer gehen.
Er geht dazu in das Unterverzeichnis "CVSROOT" und
ergänzt in der Datei "cvswrappers" die Zeile:
*.gz -k 'b'
Hinweise/Hilfe:
Man vergleiche die Manualseite zu den RCS-Kommandos (auf denen CVS
basiert!) "rcs" und "co",
Stichwort "keyword substitution" und Option "-kb" sowie
die Online-Hilfe zu CVS selbst, hier: "cvs --help add"
(unter "rcs-kflag" versteht man die Option "-k" von
"rcs" bzw. "co").
-
Wie kann Files, die mit RCS verwaltet werden,
auf CVS-Verwaltung umstellen?
Im Unterverzeichnis "RCS" bzw. im aktuellen Verzeichnis
befinden sich die RCS-Files mit der Endung ",v".
Diese werden einfach in das entsprechende CVS-Verzeichnis am Server
(erfordert natürlich im Normalfall Root-Rechte am Server) kopiert.
Beim nächsten Befehl "cvs update -d" im passenden lokalen
CVS-Arbeitsverzeichnis erscheinen die vorher mit RCS verwalteten
Files automatisch (ohne RCS-Informationen).
Beispiel:
Die mit RCS-Files verwalteten Files
programm.c
Readme.txt
befinden sich im Unterverzeichnis
"work/proj_1" auf dem Rechner
"btrzxi.rz.uni-bayreuth.de", die RCS-Files selbst
programm.c,v
Readme.txt,v
im Unterverzeichnis "work/proj_1/RCS" (auf demselben Rechner).
Das Verzeichnis für das CVS-Repository sei auf dem Rechner
"btcipmatx15.cip.uni-bayreuth.de" im Directory
"/share/cvs-repository" im Directory. Die RCS-verwalteten
Files sollen vom Arbeitsrechner
"btcipmatx9.cip.uni-bayreuth.de" aus
in das Modul "software" unter dem Unterverzeichnis
"proj_1" abgelegt werden. Das lokale CVS-Arbeitsverzeichnis
am Rechner "btcipmatx9.cip.uni-bayreuth.de"
sei unter dem Verzeichnis "~/cvs-work".
Beispiel: Nötige Kommandos sind:
# auf dem Rechner btcipmatx9.cip.uni-bayreuth.de
cd ~/cvs-work/software
# erstmal neues Unterverzeichnis unterhalb der Arbeitskopie des Moduls
# "software" anlegen
mkdir proj_1
# neues Unterverzeichnis zum Modul "software" hinzufuegen
cvs add proj_1
# auf dem Rechner btrzxi.rz.uni-bayreuth.de einloggen
ssh btrzxi.rz.uni-bayreuth.de
# Wechseln ins RCS-interne Unterverzeichnis
cd ~/work/proj_1/RCS
# Kopieren mit Secure Copy (Root-Rechte auf CVS-Server erforderlich)
# der RCS-Files "programm.c,v" und "Readme.txt,v"
# in das Unterverzeichnis "software/proj_1"
scp *,v \
root@btcipmatx15.cip.uni-bayreuth.de:/share/cvs-repository/software/proj_1
# Ausloggen am Rechner btrzxi.rz.uni-bayreuth.de
exit
# auf dem Rechner btcipmatx9.cip.uni-bayreuth.de
cd ~/cvs-work/software/proj_1
# es erscheinen die frueher mit RCS verwalteten Files
# "programm.c" und "Readme.txt"
cvs update
Sollen die Files unter CVS einen neuen Filenamen bekommen, z.B.
"prog.c" statt "programm.c" und
"Liesmich.txt" statt "Readme.txt",
braucht man nur den SCP-Befehl ändern (also die Filenamen
der RCS-Files, die im CVS-Repository gespeichert werden).
Beispiel: Nötige Kommandos sind:
# Kopieren mit Secure Copy (Root-Rechte auf CVS-Server erforderlich)
# der RCS-Files "programm.c,v" und "Readme.txt,v"
# in das Unterverzeichnis "software/proj_1" mit Umbenennen des Namens
scp programm.c,v \
root@btcipmatx15.cip.uni-bayreuth.de:/share/cvs-repository/software/proj_1/prog.c
scp Readme.txt,v \
root@btcipmatx15.cip.uni-bayreuth.de:/share/cvs-repository/software/proj_1/Liesmich.txt
# auf dem Rechner btcipmatx9.cip.uni-bayreuth.de
# erscheinen dann mit denselben Schritten wie vorher
# die frueher mit RCS verwalteten Files
# "programm.c" und "Readme.txt" als Dateien "prog.c" und "Liesmich.txt"
cvs update
War das mit RCS vorher gepflegte File (leider) gelockt (z.B. durch
ein RCS-Kommando wie "co -l address.html"), gibt es
Probleme bei späteren Veränderungen.
Beispiel: Das RCS-File "address.html,v" mit Version
1.4 wurde im gelockten Zustand in das CVS-Verzeichnis aufgenommen.
Vor Änderungen muss man zuerst mit "cvs admin -u"
den Lock-Zustand aufheben.
# Auffällig bei der unten stehenden Ausgabe ist die Zeile, die mit "locks"
# beginnt und nicht einfach nur "locks: strict" enthält,
# sondern die von User "btm543" gelockte Version 1.4 zeigt.
# Zudem steht in der Zeile nach "description:" und dem Trennstrich
# nicht einfach nur "revision 1.4", sondern der Hinweis
# "revision 1.4 locked by: btm543;".
cvs log -r address.html
# typische Ausgabe:
RCS file: /share/cvs-repository/test/work/address.html,v
Working file: address.html
head: 1.4
branch:
locks: strict
btm543: 1.4
access list:
symbolic names:
keyword substitution: kv
total revisions: 4; selected revisions: 1
description:
Adressen der Bayreuther Mitglieder
----------------------------
revision 1.4 locked by: btm543;
date: 1997/04/30 17:24:11; author: btm543; state: Exp; lines: +3 -3
...
# eine Veröffentlichung einer Veränderung
# scheitert im lock-Zustand
vi address.html
...
cvs commit address.html
# typische Ausgabe:
cvs [server aborted]: Revision 1.4 is already locked by btm543
cvs commit: saving log message in /tmp/cvs66N4ES
# Lock-Zustand von Version 1.4 aufheben
cvs admin -u1.4 address.html
# typische Ausgabe:
RCS file: /share/cvs-repository/test/work/address.html,v
1.4 unlocked
done
# "cvs log" zeigt normale Ausgaben (kein Lock-Zustand mehr)
cvs log -r address.html
# typische Ausgabe:
RCS file: /share/cvs-repository/test/work/address.html,v
Working file: address.html
head: 1.4
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 4; selected revisions: 1
description:
Adressen der Bayreuther Mitglieder
----------------------------
revision 1.4
date: 1997/04/30 17:24:11; author: btm543; state: Exp; lines: +3 -3
...
# "cvs commit" gelingt jetzt
cvs commit address.html
Am CVS-Server hätte man mit Root-Rechten
(Achtung: u.U. nicht ungefährlich!) die Datei
"address.html,v" per Hand ändern können
(vgl. das Beispiel
cd /share/cvs-repository/test/work
# diff <ungelockte Version> <gelockte Version>
# typische Ausgabe:
4c4,5
< locks; strict;
---
> locks
> btm543:1.4; strict;
am CVS-Server) und hätte dasselbe erreicht.
-
Wie kann man Files für die Utilities "patch" bzw.
"ed" aus CVS erzeugen?
Beispiel: Das File "Test_Patch.txt" soll die
Version 1.3 besitzen. Die Tests werden in einem temporären
Unterverzeichnis "temp" durchgeführt.
# erzeuge temporaeres Verzeichnis
mkdir temp
# kopiere Version 1.2 und 1.3 in dieses Verzeichnis
cvs update -r1.2 -p Test_Patch.txt > temp/Test_Patch_v2.txt
cp Test_Patch.txt temp
# erzeuge ein Differenzenfile fuer "patch" durch Option "-c"
# (steht für "context diff")
cvs diff -c -r 1.2 Test_Patch.txt > temp/patch_2.txt
# wende das Differenzenfile mit "patch" an und erzeuge
# aus der Version 1.3 die Version 1.2 (-R = reverse patch)
# (das File "Test_Patch.txt" wird modifiziert
# und enthält dann die Version 1.2)
cd temp
patch -R Test_Patch.txt patch_2.txt
# typische Ausgabe:
patching file Test_Patch.txt
# es gibt keinen Unterschied zwischen dem gepatchten File
# und der Version 1.2 aus dem CVS-Modul
# (keine Ausgabe --> Files sind gleich)
diff Test_Patch_v2.txt Test_Patch.txt
In Newsgruppen wird darauf hingewiesen, dass man Differenzenfiles
für ganze Modulverzeichnisse besser mit dem CVS-Kommand
"cvs rdiff" bzw. "cvs patch" (anderer Name) erzeugt.
Ein Teilnehmer einer Newsgruppe wies darauf hin, dass
"cvs diff -NR" bzw.
"cvs diff -NauR" rekursiv (durch Option "-R")
für Files aus Unterverzeichnissen ein Patchfile erzeugt
(durch die Option "-N" sogar für Files, die mit
"cvs add/remove" sonst ausgeschlossen sind).
Andere betonten, dass
so ein Differenzenfile keine Verzeichnisstruktur speichert und daher
nicht für "patch" geeignet ist.
Noch keine Beurteilung meinerseits ... .
Beispiel: ähnlich mit Differenzenfile für
"ed"
# gehe in uebergeordnete Verzeichnis von temp
cd ..
# erzeuge ein Differenzenfile für "ed" durch Option
# "-e" ("-e" steht für "ed"
# und ist eine Option von "diff", die man in
# "rcsdiff" und "cvs diff" verwenden kann
# Die Ausgabe erfolgt im Shellfenster.
cvs diff -e -r 1.2 Test_Patch.txt
# typische Ausgabe:
Index: Test_Patch.txt
===================================================================
RCS file: /share/cvs-repository/test/Test_Patch.txt,v
retrieving revision 1.2
retrieving revision 1.3
diff -e -r1.2 -r1.3
6a
6. Zeile
.
1c
0. Zeile
.
# speichert man die Zeilen NACH der Zeile "diff -e ..."
# in eine Datei "ed_2.txt" und hängt noch eine letzte Zeile
# mit "w" an, kann man diese Kommandos für einen ed-Aufruf
# verwenden.
cat << EOF > temp/ed_2.txt
> 6a
> 6. Zeile
> .
> 1c
> 0. Zeile
> .
> w
> EOF
cd temp
# wende das Differenzenfile mit "ed" an und erzeuge
# aus der Version 1.2 die Version 1.3
# (das File "Test_Patch_v2.txt" wird modifiziert
# und enthält dann die Version 1.3)
cd temp
cat ed_2.txt | ed Test_Patch_v2.txt
# typische Ausgabe:
# (Dateigröße)
74
83
# es gibt keinen Unterschied zwischen dem veränderten File
# und der Version 1.3 aus dem CVS-Modul
# (keine Ausgabe --> Files sind gleich)
diff Test_Patch_v2.txt ../Test_Patch.txt
-
Wie kann man ein unbeabsichtigtes Warten auf einen behobenen
Lock-Zustand am CVS-Server beenden?
Sollte bei geplanten Veränderungen des CVS-Moduls (z.B. durch
ein "cvs commit" für ein File des Moduls)
die Hinweismeldung
# typische Ausgabe eines CVS-Kommandos, das die Probleme verursachte
...
CVS locks may need cleaning up.
...
# typische Ausgabe (wiederholt sich alle 30 Sekunden):
cvs server: [12:45:22] waiting for root's lock in /share/cvs-repository/test/work
cvs server: [12:45:52] waiting for root's lock in /share/cvs-repository/test/work
...
# Eingabe von CTRL-C unterbricht das Warten
# typische Ausgabe:
cvs [commit aborted]: received interrupt signal
erscheinen, kann es sein, dass unbeabsichtigt ein File mit einem Namen
vergleichbar zu
#cvs.rfl.btcipmatx15.cip.uni-bayreuth.de.4623
am CVS-Server durch ein CVS-Problem entstanden ist. Dieses kennzeichnet
einen Lock-Zustand des Servers. Sollte dies nicht beabsichtigt worden
sein, kann man dieses File am CVS-Server (mit Root-Rechten)
löschen. Erst dann klappt z.B. ein Kommando wie "cvs commit"
wieder.
-
Wer setzt CVS ein?
CVS wird in der Public Domain-Entwicklerszene sehr häufig
eingesetzt, da viele Programme weltweit entwickelt werden und es
ist daher immer ein Problem ist, sich als Entwickler auf den
neuesten Stand des Projekts zu bringen.
Viele Public Domain-Projekte (vor allem im Linux-Umfeld)
speichern den aktuellen Stand ihrer Projekte unter
dem SourceForge-Server,
der Speicherplatz und den Webauftritt dieser Projekte unterstützt.
Dies geschieht mit Hilfe von CVS und CVSweb.
Zur weiteren Information zu SourceForge:
Informationen über SourceForge selbst
Software, die SourceForge einsetzt
cvsweb
(CGI-Skript zum Einbinden von CVS-Repositories im WWW-Server)
einige ausgesuchte Projekte unter SourceForge:
MiKTeX
(Windows-Distribution von TeX/LaTeX)
Mesa3D
(Public Domain-Clone von OpenGL, eine 3D-Grafiklibrary, die
weitgehend zu OpenGL kompatibel ist)
AFPL
Ghostscript (PostScript-Viewer)
CvsGui-Projekt bei Sourceforge
(high-end GUIs zu CVS, inkl. WinCvs, gCvs, ...)
GCW
(GCC for Windows, maximale Unterstützung von und
Binärkompatibilität zu Microsoft
Visual C++ Source Code)
einige ausgesuchte Software-Projekte, die einen Download per CVS
anbieten:
-
Apache
(freier WWW-Server)
-
Infos zum
Download der neuesten Entwicklerversion
-
CVS
(CVS-Software selbst)
-
Infos zum
Download der neuesten Entwicklerversion
-
cvsweb
(CGI-Skript zum Einbinden von CVS-Repositories in einem WWW-Server)
-
Infos zum
Download der neuesten Entwicklerversion
-
Cygwin
(Unix-Umgebung und Shell unter Windows)
-
Infos zum
Download der neuesten Entwicklerversion
-
GCC
(Gnu Compiler Collection)
-
Infos zum
Download der neuesten Entwicklerversion
-
XFree86
(Open Source-Version von X Window unter Unix, OS/2, ...,
typischerweise unter Linux mit Intel x86-Prozessoren)
-
Infos zum
Download der neuesten Entwicklerversion