= SVN = SVN ist ein Versionsmanagementsystem. Es verwaltet beliebige Daten (meistens jedoch so etwas wie Text oder Programmcode) auf einem zentralen Rechner (in unserem Fall ein Rechner bei uns am Lehrstuhl) in einem sogenannten ''repository''. Sie können sich Ihre Dateien von diesem Rechner holen (''svn checkout''), sie können neue Dateien hinzufügen (''svn add''), und den Inhalt von neuen oder geänderten Dateien in das repository hochladen (''svn commit''). Wenn jemand anderes etwas an Ihren Daten ändert (in unserem Fall die Tutoren die Ihre Programm korrigieren) bekommen Sie die neueste Version mit ''svn update''. == Hochladen der Dateien für ein neues Übungsblatt == 1. Für jedes neue Übungsblatt legen Sie bitte einen eigenen Unterordner an, etwa {{{ mkdir uebungsblatt-1 svn add uebungsblatt-1 svn commit }}} Äquivalent dazu geht auch {{{ svn mkdir uebungsblatt-1 svn commit }}} Nach jedem ''svn commit'' öffnet sich ein Editor. Dort sollen Sie knapp und präzise beschreiben, welche Änderung am SVN Sie soeben vornehmen. Für das Beispiel oben etwa: Added new subfolder for exercise sheet 1. Speichern Sie diese Nachricht und verlassen Sie den Editor. Im Anschluss wird die gewünschte Änderung am SVN vorgenommen. Welcher Editor sich öffnet hängt von der Konfiguration Ihres Systems ab. Wenn Sie möchten, dass SVN beim commit einen bestimmten Editor öffnet, können Sie das durch Setzen der Umgebungsvariablen SVN_EDITOR herbeiführen. Zum Beispiel (vorausgesetzt es gibt den Editor Vim auf Ihrem System, und er steht unter /usr/bin/vim): {{{ export SVN_EDITOR=/usr/bin/vim }}} 2. Um Ihre Code-Dateien und das Makefile für ein Übungsblatt hochzuladen, stellen Sie sicher, dass Sie in dem Unterordner sind und machen Sie dort {{{ svn add Makefile PrimeMain.cpp PrimeTest.cpp svn commit Makefile PrimeMain.cpp PrimeTest.cpp }}} Wenn Sie sicher sind, dass sie *alle* Verzeichniss in dem Ordner hochladen wollen (das ist nach ''make clean'' in der Regel der Fall, aber vergewissern Sie sich selber durch ein anschließendes ''ls -l''), können Sie auch machen {{{ svn add * svn commit }}} Das wird aber nur funktionieren, wenn Sie den Ordner, in dem sich diese Dateien befinden bereits wie unter 1. beschrieben hochgeladen haben! Sonst kommt eine der folgenden beiden Fehlermeldungen. Wenn Sie für den Order, in dem sich die beiden Dateien befinden, nicht mal ''svn add'' bzw. ''svn mkdir'' gemacht haben, kommt: {{{ svn: '.' ist not a working copy. }}} Wenn Sie für den Ordner, in dem sich die beiden Dateien befinden, ''svn add'' bzw. ''svn mkdir'' gemacht haben, aber noch kein ''svn commit'', dann kommt so etwas wie: {{{ svn: '/.../uebungsblatt-1' is not under version control and is not part of the commit, yet its child '/.../uebungsblatt-1/' is part of the commit }}} Gehen Sie in beiden Fällen in den Ordner um dem es geht (im Beispiel: uebungsblatt-1) und machen Sie dort {{{ svn add -N uebungsblatt-1 svn commit uebungsblatt-1 }}} Das -N steht hier für ''non-recursive'' und ist wichtig, damit Sie nur den Ordner und nicht irgendwelche Dateien darin hinzufügen (die Sie entweder weiter oben schon hinzugefügt haben, oder gar nicht hinzufügen wollen). Bei dem commit in der zweiten Zeile auch unbedingt den Namen des Verzeichnisses mit angeben, damit Sie in diesem Schritt nur das neue Verzeichnis hochladen und noch nichts von seinem Inhalt. Nach dem Hochladen gehen Sie wieder in den Ordner und machen noch einmal svn commit. OLD STUFF Um neue Dateien, die vorher noch nicht in unserem SVN waren, == svn checkout == Wir haben für diese Vorlesung ein eigenes SVN repository. Darin hat jeder Teilnehmer und jede Teilnehmerin ein Unterverzeichnis. Der Name dieses Unterverzeichnisses ist genau der Name ihres RZ-Accounts. Zum Auschecken Ihres Unterverzeichnisses machen Sie folgendes (unter Unix / Linux), wobei ''MYUSERNAME'' der Benutzername Ihres RZ-Accounts ist und ''MYFOLDER'' ein Verzeichnis Ihrer Wahl: {{{ mkdir MYFOLDER svn checkout http://ad-svn.informatik.uni-freiburg.de/teaching/cplusplus-ss2010/MYUSERNAME MYFOLDER --username MYUSERNAME }}} == svn add == Um eine Datei ''FILE'' die bisher noch nicht im repository war, diesem hinzuzufügen, macht man {{{ svn add FILE }}} Es wird durch dieses Kommando allerdings noch nichts auf den Server hochgeladen, sondern die betreffenden Dateien werden für das Hochladen "gescheduled". Das eigentliche Hochladen passiert dann beim nächsten ''svn commit'', siehe unten. ''svn add'' klappt auch mit mehreren Dateien gleichzeitig, zum Beispiel für ''FILE1'', ''FILE2'' und ''FILE3'' {{{ svn add FILE1 FILE2 FILE3 }}} Wenn einer der Dateien ein Ordner ist wird nicht nur der Ordner sondern gleich auch alle Dateien in diesem Ordern ge''add''ed. Wenn man das macht, sollte man aufpassen, dass auch wirklich alle Dateien in dem Ordner in das repository sollen und irgendwelche "Nebenprodukte" wie Backup-Dateien vom Editory, ''.o'' Dateien oder ausführbare Dateien vorher löschen. Wenn man eine Datei für die man schon ''svn add'' gemacht hat, doch nicht ''add''en will macht man einfach ''svn revert'' gefolgt von dem oder den betreffenden Dateinamen. == svn commit == Mit diesen Befehl werde alle Änderungen an der lokalen Arbeitskopie auf den Rechner übertragen wo das repository liegt. Also in unserem Fall, der Rechner an unserem Lehrstuhl. Änderungen sind dabei sowohl Änderungen an Dateien, die schon im repository waren, als auch Dateien, die mit ''svn add'' erstmalig dem repository hinzugefügt wurden. == svn update == Hiermit werden alle Änderungen im zentralen repository auf Ihre Arbeitskopie übertragen. Wenn sich im repository nichts geändert hat, passiert einfach nichts. Wenn sich im repository etwas geändert hat an einer Datei an der sie zwischenzeitlich auch etwas geändert haben, versucht SVN diese beiden Änderungen zusammen zu bringen, das nennt sich ''merge''. Wenn die Änderungen an verschiedenen Stellen in der Datei sind gelingt das meisten. Wenn die Änderungen an der gleichen Stelle in der Datei waren, gibt es einen sogenannten ''conflict''. Im Falle eines ''conflicts'' zeigt SVN für die betreffende Datei ein ''C'' an. Sie müssen die Datei dann editieren und den Konflikt beheben. Konkret sieht das so aus, dass in der Datei die Stellen mit dem Konflikt markiert sind (die Markierungen sind nicht zu übersehen). Es stehen dann beide Versionen da. Sie können sich dann überlegen was da stehen soll, die Datei entsprechend ändern und die Markierungen dann entfernen. Danach müssen Sie SVN explizit mitteilen, dass Sie sich um den conflict gekümmert haben und das geht mit ''svn resolved'' gefolgt von dem Namen der Datei. == svn help == Hiermit können alle verfügbaren Befehle für "svn" aufgelistet werden und weitere Informationen darüber abgefragt werden. Im Prinzip ersetzt dieser Befehl die man Pages für "svn". {{{ svn help }}} {{{ svn help add }}} [...]