HOWTO - Eine CVS Kurzanleitung ============================== Dieses HOWTO soll nur einen kurzen Einblick geben, wie man mit CVS umgeht, beschränkt sich also auf die wichtigen Funktionen einchecken und Status abfragen. Gedacht isses als schnelles "Nachschlagewerk" für das gnuher.de-/etc-mit-CVS-verwalten-Projekt, lässt sich aber das meiste lässt sich auch in anderen Bereichen verwenden (z.B. knowledgebase). 0. Inhalt ========= 1. Begriffserklärung 2. Voraussetzung 3. Einchecken 3.1 neue Datei hinzugekommen 3.2 neue Datei hinzugekommen, Fall 2 3.3 Datei wurde gelöscht 3.4 Datei wurde geändert 4. Status abfragen 4.1 Welche Dateien wurden geändert? 4.2 Was wurde geändert? 1. Begriffserklärung ==================== CVS Concurrent Versions System Repository Verzeichnisbaum, in dem CVS die Versionen und Metadaten hält. In praktisch keinem Fall sollte man die Dateien unterhalb des Respositorys von Hand ändern. Projekt/Modul In einem Repository können beliebig viele Projekte unabhängig voneinander verwaltet werden. auschecken Ein Projekt (oder Teile davon) werden aus dem Repository ins aktuelle Verzeichnis kopiert. Standardmässig checkt CVS die neuste Version jeder Datei aus. Working Copy Das, was aus dem CVS ausgecheckt wurde. Man kann beliebig viele Working Copys von einem Projekt haben, bei gnuher.de-/etc macht das aber keinen Sinn. einchecken Änderungen in der Working Copy werden erst mit diesem Schritt dauerhaft im CVS gespeichert. Durchs einchecken gehen ältere Versionen der Dateien NICHT verloren, man kann also gar nicht oft genug einchecken! Update Working Copy wird auf den Stand des Repositorys gebracht. Das ist nur dann von Bedeutung, wenn mit mehreren Working Copys gearbeitet wird. CVSROOT Environmentvariable, die auf das Repository zeigt. Wird nur gebraucht, wenn man ein Projekt auschecken will. CVS merkt sich dabei, wo das CVSROOT lag, so dass man es nicht mehr angeben muss. 2. Voraussetzung ================ Es wird vorausgesetzt, dass CVS bereits korrekt eingerichtet ist. Erkennen lässt sich das z.B. daran, dass im zu verwaltenden Verzeichnis (und allen Unterverzeichnissen) ein Ordner CVS/ enthalten ist. Ausserdem muss man als root unterwegs sein, wenn man Dateien in /etc einchecken will, denn das CVSROOT für /etc ist aus Sicherheitsgründen nur für root les-/schreibbar. 3. Einchecken ============= Nach jeder abgeschlossenen Änderung -- und sei sie noch so klein -- sollte man die geänderten Dateien einchecken. Erst damit landen sie im Repository und werden im Falle der gnuher.de gebackupt. Es sind 4 Fälle zu beachten: 3.1 neue Datei hinzugekommen ---------------------------- Man muss CVS immer explizit mitteilen, dass es neu hinzugekommene Dateien ins Repository aufnehmen soll. Das macht man mit folgendem Befehl: cvs add ... Achtung: die Datei wird noch nicht direkt ins CVS aufgenommen, sondern lediglich dafür VORGEMERKT. Die eigentliche Aufnahme geschieht erst mit cvs commit (siehe 3.4). Bei Ordnern muss man zunächst den Hauptordner vormerken, dann hinein wechseln und dann die Dateien darin vormerken. Ich wüsste leider nicht, wie man das automatisch rekursiv machen kann, ohne ein kleines Shellskript zu nutzen, lasse mich aber gerne belehren. 3.2 neue Datei hinzugekommen, Fall 2 ------------------------------------ Manchmal gibt es Dateien, die man nicht ins CVS aufnehmen will, weil sie sich ständig ändern. /etc/adjtime ist so ein Kandidat. In diesem Fall benutzt man nicht cvs add wie in 3.1 beschrieben sondern man schreibt den Namen der zu ignorierenden Datei in die Datei ".cvsignore". Jedes (Unter-)Verzeichnis in der Working Copy kann ein eigenes .cvsignore haben, denn .cvsignore gilt nur für das Verzeichnis, in dem es steht. Wenn .cvsignore noch nicht vorhanden ist legt man sie an (und nimmt sie wie in 3.1 beschrieben ins CVS auf). Der Aufbau dieser Datei ist recht simpel: * Einen Eintrag pro Zeile. * Wildcards sind erlaubt. * Nur den Dateinamen, KEINE Pfade Beispiel: echo "adjtime" >>/etc/.cvsignore 3.3 Datei wurde gelöscht ------------------------ Auch das muss man CVS explizit mitteilen. Sonst denkt es, die Datei wäre verloren gegangen. Der Befehl dazu ist fast schon offensichtlich: cvs remove ... Wie bei 3.1 gilt auch hier: Die Datei wird mit cvs remove nur VORGEMERKT. Solange kein cvs commit (siehe 3.4) gemacht wird passiert ausser der Vormerkung nichts. Natürlich löscht CVS die Datei nicht wirklich aus dem Repository. Man kann also jederzeit jede beliebige Version der Datei wieder auschecken. 3.4 Datei wurde geändert ------------------------ Klasse. Sofort einchecken. Evtl. noch kurz prüfen, ob man keine Datei vergessen hat (-> 4.1) aber dann geht's los: cvs commit ... Es poppt als nächstes ein Editor auf, der nach einem Logeintrag fragt. In den tippt man eine kleine Nachricht, was man geändert hat, das erleichtert später die Rückverfolgung von Fehlern. Dran denken, dass man neu aufgenommene und gelöschte Dateien ebenfalls mit cvs commit einchecken muss. Wenn man ALLE Dateien im aktuellen Ordner (und dessen Unterordner) auf einmal einchecken will: cvs commit Diese Variante ist mit Vorsicht zu geniessen, denn u.U. checkt man auch Dateien ein, die jemand anderes geändert hat. Das gibt möglicherweise Chaos, wenn man zurückverfolgen will, wer welche Änderung gemacht hat und warum. Wirklich alles eingecheckt? Dann müsste das in 4.1 beschriebene Kommando eine leere Ausgabe liefern. 4. Status abfragen ================== Überblick verloren, was man alles geändert aber noch nicht eingecheckt hat? 4.1 Welche Dateien wurden geändert? ----------------------------------- Das sagt uns cvs -nq update -dR Dieser spuckt eine Liste mit den Datei aus, die dringend eingecheckt werden sollten. Durch den Parameter -n werden keine Änderungen an den Dateien vorgenommen sondern lediglich ihr Status ausgegeben. Vor jedem ausgegebenen Dateinamen steht ein einzelnes Zeichen, das darüber informiert, warum diese Datei eingecheckt werden sollte. ? [unknown] CVS weiss nichts über diese Datei. Aller Wahrscheinlichkeit nach ist sie neu erstellt worden -> 3.1 bzw. 3.2 A [Added] Datei wurde gemäss 3.1 zur Aufnahme vorgemerkt R [Removed] Datei wurde gemäss 3.3 zur Löschung vorgemerkt M [Modified] Datei wurde geändert Es gibt noch mehr Zustände (Update, Patch, Conflict), die aber hier nicht von Interesse sind. 4.2 Was wurde geändert? ----------------------- Darüber gibt cvs diff ... Auskunft. Zeilen mit einem "<" davor wurde gelöscht und durch Zeilen mit einem ">" davor ersetzt.