\section{Verteiltes Programmieren mit Subversion}

\subsection{Allgemeines}

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


\subsection{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\"onnen jederzeit einzelne Dateien ver\"andert werden, es bleiben jedoch alle fr\"uheren Versionen erhalten, einsehbar und wiederherstellbar, auch k\"onnen die Unterschiede zwischen bestimmten Versionen verglichen werden. \newline
Ein Entwickler holt sich die Daten vom Server (meist \"uber http/https) und arbeitet zu Hause an einer lokalen Kopie. Sobald er seine Arbeit ver\"offentlichen will, wird er die Daten (die \"Anderungen) 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\"onnen. Probleme k\"onnen sich ergeben, wenn mehrere Mitarbeiter gleichzeitig an der selben stelle in einer Datei \"Anderungen vornehmen. In diesem Fall muss der Entwickler manuell die verschiedenen \"Anderungen zusammenf\"ugen (\emph{merge}).


\subsection{Anwendungslexikon}

\begin{itemize}
 \item{Daten herunterladen:} Dieser Befehl l\"adt 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\"ugen:} So kannst du Daten oder Verzeichnisse
   (\verb"[file]") hinzuf\"ugen. Alle Daten die zum vollst\"andigen
   Projekt geh\"oren sollten auch hinzugef\"ugt werden.
\codesnip{gobble=0}
   svn add [file]
\end{Verbatim}

 \item{Dateien l\"oschen:} Um Daten im Repository zu l\"oschen, 
   musst du diesen Befehl verwenden.
\codesnip{gobble=0}
   svn rm [file]
\end{Verbatim}

 \item{\"Anderungen anzeigen:} So kannst du deine lokalen \"Anderungen
   einsehen.
\codesnip{gobble=0}
   svn diff
\end{Verbatim}

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

 \item{Daten hochladen:} Dieser Befehl ladet deine lokalen
   \"Anderungen auf den Subversion Server. Der Verst\"andlichkeit
   zuliebe noch ein sch\"oner Kommentar \verb"[message]".
\codesnip{gobble=0}
   svn checkin -m "message"
   svn ci -m "message"
\end{Verbatim}

 \item{Weitere Informationen:} Falls du mehr \"uber einen gewissen \verb"[command]" erfahren willst\footnote{Alternative Informationsquelle: \verb"http://svnbook.red-bean.com/"}.
\codesnip{gobble=0}
   svn help [command]
\end{Verbatim}
\end{itemize}

\subsection{Subversion in Orxonox}
Orxonox verwendet eine spezielle Syntax der Log-Nachrichten beim commiten von \"Anderungen. Diese Notation erlaubt dem Betrachter einer Log-Nachricht jederzeit die T\"atigkeit 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, als z.B. in \emph{trunk} oder in \emph{branches/student1}. Die Nachricht \verb"[message]" sollte m\"oglichst kurz und einfach beschreiben, was ver\"andert worden ist und weswegen (dies ist insbesondre wichtig, wenn man Code von anderen Leuten ver\"andert).



