\section{SVN Übersicht}

\paragraph{Allgemeines}
Subversion (SVN) ist ein \emph{Version Control System}, ein Programm zur Versionsverwaltung von Dateien, hauptsächlich Software-Quellcode. Subversion ist eine Weiterentwicklung von CVS (das noch heute viel eingesetzt wird, z.B bei SourceForge), welches seinerseits eine Weiterentwicklung von RCS (Revision Control System) ist. Subversion erlaubt mehreren Entwicklern gemeinsam an einem Projekt zu arbeiten, ohne sich gegenseitig Code zu löschen.

\paragraph{Funktionsweise}
Subversion vereinfacht die Verwaltung von Quellcode dadurch, dass es alle Dateien eines Software-Projektes an einer zentralen Stelle, einem so genannten \emph{Repository}, speichert. Dabei können jederzeit einzelne Dateien verändert werden, es bleiben jedoch alle früheren Versionen erhalten, einsehbar und wiederherstellbar. Ausserdem können Unterschiede zwischen bestimmten Versionen verglichen werden. \newline
Ein Entwickler holt sich die Daten vom Server (meist über http/https) und arbeitet zu Hause an einer lokalen Kopie. Sobald er seine Arbeit veröffentlichen will, wird er die Daten (die Änderungen) wieder auf den Server laden (\emph{commit}). Der Server wird dann seine eigene Kopie updaten und schauen, dass alle anderen Entwickler an eine aktuelle Version gelangen können. Probleme können sich ergeben, wenn mehrere Mitarbeiter gleichzeitig an der selben Stelle in einer Datei Änderungen vornehmen. In diesem Fall muss der Entwickler manuell die verschiedenen Änderungen zusammenfügen (\emph{merge}).


\paragraph{Anwendungslexikon}
Im Folgenden findet Ihr eine Zusammenfassung der wichtigsten Befehle, welche ihr bei SVN benötigen werdet. Unter vielen Systemen gibt es grafische Oberflächen für SVN, welche die Handhabung wesentlich vereinfachen. Unter Linux können wir RapidSVN\footnote{\url{http://rapidsvn.tigris.org/}} empfehlen, auf Windows hat sich TortoiseSVN\footnote{\url{http://tortoisesvn.tigris.org/}} bewährt.
\begin{itemize}
\item{Daten herunterladen:} Dieser Befehl lädt die neueste Version von \verb"[repository]" an die angegebene \verb"[destination]".
\codesnip{gobble=0}
svn checkout [repository] [destination]
svn co [repository] [destination]
\end{Verbatim}

\item{Dateien hinzufügen:} Mit diesem Befehl können neue Dateien oder Verzeichnisse (\verb"[file]") zum Projekt hinzugefügt werden.
\codesnip{gobble=0}
svn add [file]
\end{Verbatim}

\item{Dateien löschen:} Um Dateien aus dem Repository zu entfernen, muss dieser Befehl verwendet werden.
\codesnip{gobble=0}
svn rm [file]
\end{Verbatim}

\begin{minipage}[t]{459 pt}
\item{\"Anderungen anzeigen:} Damit können lokale Änderungen eingesehen werden.
\codesnip{gobble=0}
svn diff
\end{Verbatim}
\end{minipage}

\item{Neue Version herunterladen:} Synchronisiert das lokale Repository mit dem Server und lädt alle Änderungen herunter.
\codesnip{gobble=0}
svn up
\end{Verbatim}

\item{Daten hochladen:} Dieser Befehl lädt die lokalen Änderungen auf den Subversion Server hoch. Zur besseren Verständlichkeit wird ein Kommentar \verb"[message]" hinzugefügt.
\codesnip{gobble=0}
svn checkin -m "message"
svn ci -m "message"
\end{Verbatim}

\item{Weitere Informationen:} Falls du mehr über einen gewissen \verb"[command]" erfahren willst\footnote{Alternative Informationsquelle: \url{http://svnbook.red-bean.com/}}, bietet sich der help Befehl an.
\codesnip{gobble=0}
svn help [command]
\end{Verbatim}
\end{itemize}

\paragraph{Subversion in Orxonox}
Orxonox verwendet eine spezielle Syntax der Log-Nachrichten beim commiten von Änderungen. Diese Notation erlaubt dem Betrachter einer Log-Nachricht, jederzeit die Tätigkeit und den Arbeitsort festzustellen:
\codesnip{gobble=0}
svn ci -m "orxonox/[folder]: [message]"
\end{Verbatim}

Wobei \verb"[folder]" den Ort bezeichnet, an dem du gearbeitet hast, also z.B. in \emph{trunk} oder in \emph{branches/student1}. Die Nachricht \verb"[message]" sollte möglichst kurz und einfach beschreiben, was verändert wurde und weswegen (dies ist insbesondere dann wichtig, wenn man Code von anderen Leuten verändert).\\
Auch wenn es zwischendurch mühsahm erscheinen mag: Es ist sehr wichtig, dass du \textbf{immer eine Log-Nachricht spezifizierst} beim commiten, da die anderen Entwickler ansonsten den Inhalt des Commits selber herausfinden müssen.
