- 
    
    
      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