Apache und Subversion

Hinweis: Der Artikel ist für ältere Versionen von Apache und Subversion geschrieben, im Detail kann es Änderungen gegeben haben.

Benötigte Programme

  1. Apache 2 (benutzte Version: Xampp 1.6.2 mit Apache 2.2.4)
  2. Subversion (1.4.4)
  3. TortoiseSVN (1.4.4)
  4. die LaTeX-Pakete svn, svninfo und svn-multi

Apache 2 Setup

Für die Installation des Webservers gibt es zwei sinnvolle Möglichkeiten. Entweder installiert man den Apache allein oder aber nutzt ein fertiges Paket wie Xampp. Die Installation mit Xampp beschreibe ich weiter unten. Apache ist für den Einsatz von Subversion nicht zwingend notwendig, möglich ist auch der Einsatz eines dedizierten SVN-Servers. Ich habe jedoch gute Erfahrungen mit Apache gemacht, daher beschreibt dieser Artikel nur die Apache Installation. Die Installation selbst ist selbsterklärend, mehr als auf ‚Weiter‘ klicken ist für den Hauptteil der Installation nicht notwendig. Bei der Abfrage der Domaineinstellungen sollte man sich aber auf eine nicht-existierende Domain beschränken.

In diesem Dialog kann man auch einstellen, ob Apache als Systemdienst oder manuell zu startende Anwendung installiert werden soll. Persönlich lasse ich meinen Apache als Dienst laufen, da der Rechner vollständig vom Internet getrennt ist, sind keine Sicherheitsprobleme zu befürchten. Wenn der Dienst läuft, sollte nach der Eingabe von http://localhost die folgende Webseite erscheinen.

Davon ausgehend, dass die einzigen Zugriffe auf Apache/Subversion vom lokalen Rechner kommen werden, ist der nächste Schritt ist die Absicherung des Webservers gegen den Zugriff aus dem Internet. Das Apache Installationsverzeichnis enthält im conf Verzeichnis die Datei httpd.conf, die sämtliche Einstellungen für Apache enthält. Der für uns interessante Teil dieser Datei ist der folgende:


Directory "C:/Programme/Apache Group/Apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All" doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs-2.0/mod/core.html#options
# for more information.
#

Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>

Die letzten Zeilen legen fest, dass ausser ‚localhost‘ mit der IP-Adresse 127.0.0.1 niemand auf unseren Webserver zugreifen soll. Nach jeder Änderung muß der Apache neu gestartet werden, im Fall einer totalen Fehlkonfiguration findet man im /conf Verzeichnis noch die Datei http.conf.default.

Die grundlegende Apache Konfiguration ist damit abgeschlossen, später werden wir noch einige Änderungen vornehmen.

Subversion und TortoiseSVN

Im nächsten Schritt installieren wir Subversion und TortoiseSVN. Letzteres ist nicht unbedingt nötig, da Subversion auch über die Kommandozeile bedient werden kann. Es ist aber mehr als nur ratsam, da die Bedienung dadurch stark vereinfacht wird. Die Installation ist auch hier selbstbeschreibend, einfach nur auf ‚Weiter‘ klicken (bei der Installer-Version auch anbietet, die Module selbständig in Apache zu installieren). Die Zip-Version installiert man einfach in ein geeignetes Verzeichnis, in unserem Fall C:\Programme\Subversion und fügt den Pfad zu C:\Programme\Subversion\bin der PATH-Variablen hinzu.

Die Funktion von Subversion und TortoiseSVN läßt sich an diesem Punkt bereits testen, indem wir die Subversion Quellen herunterladen. Von der Kommandozeile aus wechselt man in ein leeres Verzeichnis und checkt die Quellen aus:

svn checkout http://svn.collab.net:81/repos/svn/trunk subversion

Bei installiertem TortoiseSVN geht man im Explorer in ein leeres Verzeichnis und ruft über die rechte Maustaste den Menüeintrag SVN Checkout auf:

In das Feld ‚URL of Repository‘ gibt man dann die URL http://svn.collab.net:81/repos/svn/trunk ein. Der SVN client sollte dann die Dateien aus dem Repository abholen, am Ende sollte das Fenster so oder ähnlich aussehen.

Integration von Subversion in Apache

Zur Integration von Subversion in den Webserver kopieren wir

  • mod_dav_svn.so
  • mod_authz_svn.so

aus dem C:\Programme\Subversion\bin Verzeichnis nach C:\Programme\Apache Group\Apache2\modules. Anschließend editieren wir wieder C:\Programme\Apache Group\Apache2\conf\httpd.conf

  • entfernen das # der # LoadModule dav_module modules/mod_dav.so Zeile
  • fügen LoadModule dav_svn_module modules/mod_dav_svn.so

am Ende des LoadModule Blocks ein. Anschließend ist es Zeit für einen Neustart (ohne Neustart ließ sich Apache nicht starten) von Rechner und Webserver, damit alle Module richtig arbeiten. Wenn wir jetzt im htdocs Verzeichnis des Webservers ein Verzeichnis 'test' erstellen und im Webbrowser http:\\localhost\test aufrufen, sollte eine leere Verzeichnisansicht erscheinen, darunter die Apache Statusmeldung:

Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e SVN/1.4.4 mod_autoindex_color PHP/5.2.2

Testen der Installation

Als nächstes richten wir ein Testrepository ein, mit dem wir die korrekte Funktionsweise von Apache, Subversion und TortoiseSVN überprüfen. Dazu legen wir uns ein leeres Verzeichnis c:\alleMeineRepos an. Dieses Verzeichnis wird uns als Stammverzeichnis für sämtliche Repositories dienen. In der Apache Konfigurationsdatei fügen wir dann folgende Zeilen ein.


<Location /svn>
DAV svn
SVNParentPath c:/alleMeineRepos
</Location>

Hinweis: Diese Konfiguration läßt jegliche Sicherheitsaspekte außen vor, ohne das ‚deny from all‘ in der httpd.conf wäre unser Repository über das Internet erreichbar.

Soll der Apache mit Subversion übers Netz erreichbar sein, sollte man die Nutzungsbeschränkungen etwas genauer setzen. Eine Lösung wäre, das Allow statement in der httpd.conf auf das lokale Subnetz zu beschränken, genauer läßt sich der Zugriff aber über Passwörter regeln. Eine öglichkeit kann so aussehen :

  • schreibender Zugriff auf das Repository nur für ausgewählte Nutzer
  • lesender Zugriff, d.h. checkout, für eine andere Grupper Nutzer bzw.
    alle

Um unser SvnParent Verzeichnis gegen unauthorisierten Zugriff zu schützen, ändern wir die SvnParent Konfiguration in der httpd.conf wie folgt ab:


<Location /svn>
DAV svn
SVNParentPath c:/alleMeineRepos
AuthType Basic
AuthName "Subversion repository"
AuthUserFile C:/apachefriends/xampp/apache/passwort
Require valid-user
</Location>

Was bewirkt diese Änderung? Letztendlich, dass nur Benutzer auf das Verzeichnis /svn zugreifen können, deren Username und Passwort in der Datei c:\alleMeineRepos\passwords.txt stehen. Um diese Einträge zu erzeugen, nutzen wir den htpasswd Befehl aus dem Apache /bin Verzeichnis. Die Syntax lautet:

htpasswd [-cmdpsD] passwordfile username
htpasswd -b[cmdpsD] passwordfile username password

htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don't update file; display results on stdout.
-m Force MD5 encryption of the password (default).
-d Force CRYPT encryption of the password.
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
-D Delete the specified user.

Mit htpasswd -c C:/apachefriends/xampp/apache/passwort uwe MeinPassWort legen wir einen Nutzer samt Passwort an. Nach einem abschließenden Neustart des Apache ist unser /svn Verzeichnis dann geschützt. Mehr zum Thema Apache Sicherheit findet man auf der entsprechenden Webseite der Apache Dokumentation.

Hinweis Die Option -c zum Anlegen der Datei ist nur beim Eintrag des ersten Nutzers anzugeben. Gibt man sie bei der Eintragung weiterer Nutzer auch an, wird die Passwort-Datei überschrieben! Der Vorteil von SVNParentPath gegenüber einer SVNPath Lösung ist, dass wir in diesem Verzeichnis die einzelnen Repositories anlegen können, ohne Apache neu starten zu müssen. Eine http://localhost/svn/xxx URL wird dann nach c:\alleMeineRepos\xxx aufgelöst.

Im Verzeichnis c:\alleMeineRepos legen wir anschließend ein Verzeichnis test an und wechseln in dieses Verzeichnis. Mit der rechten Maustaste rufen wir den Eintrag TortoiseSVN => Create Repository here... auf. Die optimale Antwort auf die Frage, welches Filesystem eingerichtet werden soll, kenn ich nicht, daher nehmen wir mal Native
Filesystem
. Für die genauen Unterschiede der Filesysteme sei auf die Subversion Anleitung verwiesen.

Der äquivalente Subversion Befehl lautet:

svnadmin create c:\alleMeineRepos\test

Anschließend sollte nach Eingabe der URL http:\\localhost\svn\test folgende Seite erscheinen.

Die Konfiguration ist damit abgeschlossen, als nächstes müssen wir unser Repository mit Dateien füllen.

Dateiimport und Versionsverwaltung

Als Beispiel für eine erste Anwendung von Subversion erstellen wir eine Artikel-Musterklasse. Dazu legen wir in einem leeren Verzeichnis eine einfache LaTeX-Datei an.


\documentclass{article}
\begin{document}

Hallo Welt!

\end{document}

Wir wechseln dann mit dem Windows Explorer in dieses Verzeichnis und wählen aus dem Auswahlmenü (rechte Maustaste) TortoiseSVN => Import. Im dann erscheinenden Dialogfeld geben wir die URL zum Repository an und legen noch einen kurzen Kommentar an.

Dann sollte folgende Bestätigung kommen:

Ein Aufruf der URL des Repositories im Browser sollte ungefähr so aussehen:

Der entsprechende Kommandozeilenbefehl lautet svn import http://url_des_repository --file c:\svn.log

Ohne Angabe von –file nörgelt Subversion, da es etwaige Importfehler protokollieren will.

Jetzt wird es Zeit, ein Arbeitsverzeichnis zu erstellen und unser Repository auszuchecken. Wir erstellen ein Verzeichnis, beispielsweise C:\MeineDateien\LaTeX\Vorlagen und wechseln in dieses Verzeichnis. Über die rechte Maustaste oder den Eintrag im Datei Menü wählen wir SVN Checkout... und geben wieder die URL des Repositories an.

Der entsprechende Kommandozeilenbefehl lautet: svn checkout http://url_des_repository

Neben der ausgecheckten artikel.tex, die jetzt ein grünes Häkchen (= unverändert) im Logo hat, enthält C:\MeineDateien\LaTeX\Vorlagen ein .svn Verzeichnis, das wir nicht löschen dürfen. In diesem Verzeichnis werden die Dateien gespeichert, mit deren Hilfe Subversion feststellt ob eine Datei verändert
wurde oder nicht.

Wir können die LaTeX-Datei jetzt modifizieren, beispielswiese ein \usepackage[ngerman]{babel} in die Präambel setzen. Aus dem grünen Häkchen wird nach dem Speichern ein rotes Ausrufezeichen. Im Datei Menü und per rechter Maustaste steht jetzt auch SVN Commit zur Verfügung, das unsere Datei ins Repository einstellt. Wie beim initial import können wir noch eine Anmerkung eingeben.

Die wichtigsten Funktionen für den Umgang mit Subversion und TortoiseSVN haben wir damit erledigt, jetzt kümmern wir uns um das Zusammenspiel von Subversion und LaTeX.

Subversion Informationen in LaTeX einbetten

Subversion kann eine Reihe von Stichwörtern in Quelldateien automatisch aktualisieren, d.h. Platzhalter für die aktuelle Versionsnummer werden bei jeder Änderung automatisch hochgezählt. Folgende Stichwörter, die in der Quelldatei in der Form $Stichwort$ stehen müssen, werden erkannt:

  • Date, der Zeitpunkt der letzten Dateiänderung im Repository. Form:
    $Date: 2004-09-28 12:20:27 -0600 (Mon, 29 Sep 2005) $
  • Revision, die letzte Versionsnummer. Form $Revision: 135$
  • Author, der letzte Autor der diese Datei änderte. Form $Author: Uwe$
  • HeadURL, die komplette URL zu dieser Datei. Form: $HeadURL: http:\\localhost\svn\test\artikel.tex$
  • Id, eine Zusammenfassung der o.g. Stichwörter

Wenn Subversion diese Ersetzung vornehmen soll, müssen wir die Liste der zu ersetzenden Stichwörter übergeben. Dazu wechseln wir in der Kommandozeile in das Arbeitsverzeichnis (bei mir C:\MeineDateien\LaTeX\Vorlagen) und geben folgenden Befehl ein: svn propset svn:keywords "Date HeadURL Revision Id " artikel.tex

Subversion sollte dann zurückgeben: Eigenschaft 'svn:keywords' für 'artikel.tex' gesetzt

Testen können wir das erfolgreiche Setzen der Eigenschaften, indem wir in der ersten Zeile unseres Dokuments $HeadURL$ einfügen und ein commit durchführen. Nach dem Commit steht statt $HeadURL$ $HeadURL: http://localhost/svn/test/artikel.tex $ in der Datei.

Zur Benutzung der Subversion Keywords gibt es zwei Pakete auf CTAN, svn und svninfo. Das svninfo Paket ist neueren Datums und bietet vermutlich auch mehr Funktionen, daher gehe ich an dieser Stelle nur auf svninfo ein.

Das Paket wird mit \usepackage{svninfo} geladen, verschiedene Optionen für die Datumsfunktionen und Kopfzeilen stehen bereit, siehe Anleitung. Zum Transfer der Subversion Informationen muß

  • das svn:keywords "Id " für die zu verwaltende Datei gesetzt
    sein, siehe oben
  • \svnInfo $Id$ nach \begin{document}
    in diese Datei eingefügt werden
  • ein Commit durchgeführt werden, damit der Id-String expandiert wird

Anschließend stehen die folgenden Befehle zur Verfügung

  • \svnInfoFile, Name der Quelldatei
  • \svnInfoRevision, Revision der Datei
  • \svnInfoDate, Datum in der Form YYYY-MM-DD
  • \svnInfoTime, Auscheckzeit der Datei
  • \svnInfoMonth, Auscheckmonat
  • \svnInfoYear, Auscheckjahr
  • \svnInfoOwner, Besitzer (leer, wenn das Repository nicht passwortgeschützt
    ist)
  • \svnInfoDay, Auschecktag
  • \svnInfoLongDate, Auscheckdatum in der Form wie \today
  • \svnId, Ausgabe wie $Id$


\documentclass{article}
\begin{document}
\svnInfo $Id$
\title{\svnInfoFile}
\author{Uwe}
\maketitle

Hallo Welt!
\end{document}

Literatur

http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-serversetup-svnserve.html

http://www.apachefriends.org

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website