CVS Studienprojekt WS 08/09 Richard Planert Concurrent Version System Ein Versionsverwaltungssystem • Wichtig: Veränderungen nachvollziehen zu können • um nicht jede Änderung selbst speichern zu müssen CVS zur Verwaltung aller Arten von Textdateien geeignet Hauptaufgaben: • • • • Protokollierung der Änderungen Wiederherstellung alter Versionen einzelner Daten Koordinierung des gemeinsamen Zugriffs Gleichzeitige Entwicklung Repository/Archiv Zentrales Archiv (Hauptkopie eines Projektes) • verfolgt zwei scheinbar unabhängige Ansätze Historienverwaltung Zusammenarbeit • speichert nur die Unterschiede zwischen zwei Revisionen um Speicherplatz zu sparen • Ist nichts weiter als ein Datei-/Verzeichnisbaum, der auf einem Server gespeichert wird • Kein Sperren (locking) von Dateien CVS-Server • Enthält ein Verzeichnis für jedes Projekt • Jede Datei wird im jeweiligen Verzeichnis mit ihrem Namen gespeichert • Allerdings mit Zusatzinformationen: • • • • • • Allg.Beschreibung der Datei Unterschiede zu vorheriger Revision Dem Zeitpunkt jeder Änderung Kommentare des Entwicklers zu Änderung Name des Entwicklers Eine Revisionsnummer Client-Server CVS ist eine Client-Server-Anwendung • CVS-Client greift auf das CVS-Server-Archiv zu • Das Repository wird von einem CVS-Server verwaltet. • Die Benutzer verwenden einen CVS-Client, der wiederum über den CVS-Server auf das Repository zugreift. • Übertragen von Dateien ausschließlich per CVS-Kommandos Arbeitskopie Lokale Arbeitskopie • Stand eines Projektes in Form eines Verzeichnisbaums aus aktuellen Dateien erzeugen kann • Ein Entwickler A arbeitet frei an seiner Arbeitskopie • Zum gleichen Zeitpunkt können auch andere an ihrer eigenen Kopie arbeiten • Da sie voneinander unabhängig keine Konflikte • Nur an ihr werden direkt Veränderungen vorgenommen CVS-Begriffe Import • Übertragen Textdateien ins Archiv • Existierende Dateien unter die Kontrolle von CVS stellen Checkout • ein Projekt aus dem Archiv in die lokale Arbeitskopie übertragen Commit = Checkin • Lokale Änderungen der Arbeitskopie an das Archiv senden Update • die lokale Arbeitskopie aktualisieren • Veränderungen aus dem Archiv in die eigene Kopie einfließen lassen Revision • Version einer Datei • Die Revisionsnummer wird automatisch erhöht sobald neue Revision ins Archiv abgelegt wird Ablauf Konflikt • wenn zwei Entwickler den gleichen Teil einer Datei bearbeiten und „committen“ • Zusammenführen (Mergen) von Änderungen, teils automatisch möglich bei komplexen Änderungen bzw. Scheitern des Zusammenführens muss der Nutzer eingreifen (Konflikt) • Wird ein Konflikt angezeigt, ist ein „commit nicht möglich Konflikt auflösen Erst dann hochladen • Veränderungen sollten unter den Entwicklern abgesprochen werden Ablauf (2) Marken Mit einer Marke, oder auch Tag, kann man die zusammengehörenden Revisionen der Dateien markieren So kann man lauffähige Versionen markieren • Später darauf zugreifen • Arbeitskopie mit „haftender“ Marke kann nicht aktualisiert werden • Änderungen können nicht ins Archiv (Vergangenheit) Verzweigungen (Engl.: Branches) CVS erlaubt durch Verzweigungen das Verändern der Vergangenheit Parallele Weiterentwicklung, ohne dass die Hauptentwicklungslinie davon beeinflusst wird Üblicherweise wird nach Abschluss der Änderungen wieder reintegriert, auch merge genannt Verzweigungen (2) Zweige starten immer an der Wurzel, in Verbindung mit einer Marke CVS-Syntax Allgemein: Cvs [globale Optionen] Kommando [Kommandooptionen] [Dateien] Zugriff auf ein Archiv: • Noch keine lokale Arbeitskopie, wohin soll sich CVS wenden? • Lokales Archiv: cvs -d /usr/local/archiv Kommando • Netzwerk bzw. Internet: :Zugriffsmethode: Benutzer @ Rechner:Verzeichnis Kommando Z:B.: cvs -d :pserver:[email protected]:/usr/local/archiv login Andere Zugriffsmethode: z.B. ext (ssh, rsh) Neues Projekt Cvs import -m "Kommentar" Projektname Hersteller-Marke Versions-Marke Beispiel: >Cd testprojekt/ >ls Test.java unterverzeichnis/ >cat Test.java public class Test { public static void main(String[] args) { System.out.println("Hallo Welt"); } } >cvs import –m "initaler Import" testprojekt benutzer start N testprojekt/Test.java Cvs import: Importing /usr/local/archiv/testprojekt/unterverzeichnis N testprojekt/unterverzeichnis/Test2.java No conflicts created by this import > • Das Projekt wird unter dem Namen „testprojekt“ in das Archiv importiert Arbeitskopie Cvs checkout Projektname • Dabei wird im aktuellen Verzeichnis ein Ordner mit dem Namen des Projekts angelegt Beispiel: >cvs checkout testprojekt Cvs checkout: Updating testprojekt U testprojekt/Test.java Cvs checkout: Updating testprojekt/unterverzeichnis U testprojekt/unterverzeichnis/Test2.java >ls testprojekt/ Test.java CVS/ unterverzeichnis/ Im automatisch erstellten Ordner CVS befinden sich Verwaltungsinformationen Aktualisieren Cvs update [-r Revision] [-D Datum] [-A] [Dateien] Cvs –q update • (Auslassen einiger unwichtiger Meldungen) Cvs update –d • (mit neuen Verzeichnissen) Beispiel: >cvs –q update M testprojekt/Test.java U testprojekt/unterverzeichnis/Test2.java Archiv Änderungen in der lokalen Arbeitskopie in das Archiv übernehmen Cvs commit –m "Kommentar" [Dateien] Beispiel: >cat Test.java public class Test { public static void main(String[] args) { System.out.println("Hallo Welt"); System.out.println(„Neu"); } } >cvs –q update M Test.java >cvs commit –m „Erweiterung“ Cvs commit: Examining Cvs commit: Examining unterverzeichnis Checking in Test.java; /usr/local/archiv/testprojekt/Test.java,v <-- Test.java New revision: 1.2; previous revision: 1.1 done Konflikt • Zu einem Konflikt kommt es bei einem update, wenn die lokal veränderte Datei bereits im Archiv geändert wurde Beispiel: >cvs update Test.java RCS file: /usr/local/archiv/testprojekt/Test.java Retrieving revision 1.2 Retrieving revision 1.3 Merging differences between 1.2 and 1.3 into Test.java Rcsmerge: conflict during merge Cvs update: conflicts found in Test.java C Test.java • Der nicht überlappende Text wird zusammengemischt • CVS fügt beide Veränderungen wie folgt in die Datei ein: [...] System.out.println("Hallo Welt"); System.out.println(„Neu"); <<<<<< Test.java System.out.println(„Neu3"); ====== System.out.println(„Neu2"); >>>>>> 1.3 (letzte Revisionsnummer des Archivs) [...] Andere CSV-Kommandos Den Status einer Datei • Cvs status [Datei] Grober Überblick über Veränderungen • Cvs log [Datei] Dateien hinzufügen • Cvs add Datei Marken/ Tag anheften bzw. Zweig erstellen • Cvs tag [-b] Markenname [Dateien] Arbeitskopie auf die Wurzel des Zweiges setzen • Cvs update –r Zweig-Marke Zweige verschmelzen • Cvs update –j Zweig-Marke