= Subversion (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''. == 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: {{{ svn checkout https://daphne.informatik.uni-freiburg.de/ss2017/AlgoDat/svn/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" (markiert). Das eigentliche Hochladen passiert 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 revert == {{{ svn revert FILE }}} Setzt eine Datei auf den zuletzt commiteten Stand zurück. Ein ''svn add'' kann damit rückgängig gemacht werden, solange kein ''svn commit'' durchgeführt wurde. == 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 commit'' schlägt fehl, wenn Dateien geändert werden sollen, welche in gesperrten Verzeichnissen liegen. Dies ist bei älteren Übungsblättern nach dem Ablauf der Abgabefrist der Fall. == 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 remove == {{{ svn remove FILE }}} Entfernt die Datei sowohl lokal als auch im Repository. Die Änderung muss per ''svn commit'' übermittelt werden. == 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 }}}