SVN via Shell und SSH

PPM Prüfung überstanden, aber nicht glorreich. Bestanden, aber mit einem fiesen Nachgeschmack…

Als positives Gegenstück möchte ich hier kurz meine Erfahrungen mit Subversion zusammenfassen, die ich im bisherigen Verlauf der Arbeit an meiner Diplomarbeit gesammelt habe. In einem Satz: “Es funktioniert halt einfach!”

Einleitung

Ich habe kein spezielles Repository über HTTP oder dergleichen aufgesetzt. Mein Ansatz geht von ein paar Prämissen aus:

  • Gearbeitet wird unter einem unixoiden Betriebssystem mit Shell (hier Ubuntu Linux in verschiedenen Varianten)
  • Zugang über die Shell reicht für das Arbeiten am Rechner mit dem Repository
  • Für Remotezugriff kann SSH verwendet werden
  • Das Repository gehört mir selber, d.h. ich authentifiziere mich nicht weiter

Das Repository richtet man da ein, wo Plattenplatz ist und Zugriff besteht. Das Tutorial verrät, wie das geht. Wir nehmen nun an, wir haben ein Repository unter $HOME/SVN/ auf unserem Server angelegt.

URI für SVN Repositories

Um im weiteren Verlauf auf das Repository zugreifen zu können, müssen wir immer wieder die URI des Repositories angeben. Wenn wir direkt auf dem Server arbeiten, dann benutzt man einfach eine file:// URL der folgenden Form:

  • file://Pfad/VirtuellerPfad

Der Pfad muss das führende Slash enthalten. Beispielsweise könnte die URI so aussehen: file:///home/me/SVN/SomeProject/

Für den Remotezugriff verwendet man eine URL mit dem speziellen Protokoll svn+ssh://, welches der Subversionclient für die Kommandozeile anbietet. Man baut sich eine ähnliche URL zusammen, wie man sie auch von SSH her kennt, inklusive Benutzer und Zielrechner:

  • svn+ssh://username@hostname:Pfad/VirtuellerPfad

Beispielsweise so: svn+ssh://me@meinserver.de:/home/me/SVN/SomeProject/

Man beachte das SomeProject/ ein virtueller Pfad ab der Wurzel des Repositories darstellt.

Subversion fragt falls nötig nach dem Passwort. Hier empfiehlt es sich massiv mit SSH-Keys (Anleitung) zu arbeiten, da auf die Dauer die Passwortabfragen stören. Diese sind beim Remotezugriff für jedes Kommando anzugeben, was natürlich stört. Inwiefern man SSH-Keys als Sicherheitsrisiko einstuft, überlasse ich dem Einzelnen, ggfs. bei Martin Diedrich eine fundierte Meinung einholen ;)

Projekte auschecken

Wenn wir nun eine Arbeitskopie aus unserem Repository auschecken wollen, dann benutzen wir das folgende Kommando:

  • svn checkout $URI/Projekt

Das erstellt dann ein Unterverzeichnis im lokalen Arbeitsverzeichnis, in dem man alle Arbeitsschritte erledigt.

Aussehen kann das so:

  • cd
  • cd work
  • svn checkout file:///home/me/SVN/megaleet/
  • cd megaleet

Das Auschecken muss mn nur einmal erledigen, im folgenden synchronisiert man nur die Arbeitskopie mit dem Repository und überträgt nur die erfolgten Änderungen.

Der Arbeitszyklus

Gearbeitet wird im Verzeichnis der Arbeitskopie. Bevor man mit dem Arbeiten beginnt, sollte man sich den aktuellen Stand des Projektes aus dem Repository herunterladen. So bekommen wir die Änderungen von Teamkollegen gleich mit und insbesondere verheddern wir uns nicht, wenn man an zwei Arbeitsplätzen Arbeitskopien hat (z.B. wie ich daheim und im Labor).

  • cd <Verzeichnis der Arbeitskopie>
  • svn update

Jetzt können wir fleissig Dateien in der Arbeitskopie bearbeiten und verändern. Im Gegensatz zu CVS funktioniert das auch mit Binärdateien, z.B. Bildern gut. Sind wir mit der Arbeit fertig, so können wir den aktuellen Stand der Arbeit im Repository abgleichen. Dazu führen wir den sogenannten Commit aus, der unsere Änderungen in das Repository überträgt.

  • svn commit

Subversion macht auch $EDITOR (wörtlich gemeint, Default is meistens vi) auf und erlaubt uns so einen Kommentar zur Änderung einzugeben.

Prinzipiell ist es möglich auf jeden Stand wieder zurückzugehen, der einmal ins Repository eingecheckt wurde. Ebenso ist Branching möglich, aber diese fortgeschrittenen Anwendungsfälle möchte ich hier nicht behandeln.

Dateien zum Repository hinzufügen

Nehmen wir an, wir wollen eine neue Quelldatei zu unserem Repository hinzufügen. Dazu wird diese Datei zunächst erstellt und anschließend dem Repository bekanntgemacht. Mit dem nächsten Commit ist dann die Daei im Repository vorhanden.

  • cd <Verzeichnis der Arbeitskopie>
  • svn add <tolle files>
  • svn commit

    Löschen und Umbenennen ist ebenfalls möglich, ich empfehle ein Studium der Dokumentation zu Subversion für nähere Informationen.
    Neues Projekt in das Repository aufnehmen

    Wenn wir ein neues Projekt in unser Repository aufnehmen wollen, dann gehen wir wie folgt vor:

    • Projektstruktur erstellen (Verzeichnisse, erste Dateien)
    • svn import <Verzeichnis des neuen Projektes> $URI/Projektname/

    Das Projekt wird jetzt importiert. Dazu zwei Anmerkungen:

    • Die Angabe des Unterprojektes in der Repository-URI ist wichtig, da sonst nur flache Files importiert werden.
    • Das importierte Verzeichnis gilt nicht als Arbeitskopie, eine solche muss erst wieder ausgecheckt werden.

    Ein Beispiel verdeutlicht das Vorgehen:

    Sei $HOME/work/someproject/ das Projektverzeichnis, welches in das Repository aufgenommen werden soll.

    • cd $HOME/work/
    • svn import someproject/ file:///home/me/SVN/someproject/
    • mv someproject someproject_old/ <- das Verzeichnis ist noch keine Arbeitskopie
    • svn checkout file:///home/me/SVN/someproject/
    • cd someproject
    • …arbeiten im Projekt
    • svn commit

    Analog können natürlich auch URIs für eine SSH-Verbindung angegeben werden.

    Backup des Repositories

    Ein einfaches Backup des Repositories ist möglich.Dazu ist einfach das Verzeichnis des Repositories mit tar einzupacken:

    • tar cvzf ~/SVN_Backup.tgz ~/SVN/

    Zur Wiederherstellung wird das Backup dann einfach ausgepackt.
    Für weitere Informationen zu Subversion empfehle ich auf der Webseite von Subversion zu schmöckern. Es lohnt sich :)