[[Vorlage(Archiviert, )]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Paketquellen_freischalten: Bearbeiten von Paketquellen] [:Programme kompilieren:Programme aus dem Quellcode erstellen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Apache: Apache Webserver installieren] }}} [[Inhaltsverzeichnis(1)]] [[Bild(./subversion_logo.png, 200, align=left)]] [http://subversion.apache.org/ Subversion] {en} (SVN) ist ein [:Versionsverwaltung:Versionsverwaltungsystem]. Diese Anleitung beschreibt, wie man Subversion zusammen mit der [:Archiv/Apache/mod_dav:Apache-Schnittstelle WebDAV] aufsetzt. Alternativ kann man einen SVN-Server auch ohne Apache aufsetzen. = Installation = Die folgenden Pakete sind zu installieren [1]: {{{#!vorlage Paketinstallation subversion libapache2-svn, universe, optional für den Webserver nötig }}} = Subversion zur Installation neuer Software nutzen = Viele Entwickler bieten die Möglichkeit, ihre Software über Subversion (SVN) zu nutzen. Dabei wird im Prinzip nichts anderes gemacht, als die Software via SVN herunterzuladen und sie für das Kompilieren abzulegen. Vorteil dabei ist, dass man so ganz einfach den einmal heruntergeladenen Quellcode über SVN aktualisieren kann, um dann eine neue Version der Software zu Kompilieren und zu installieren. Über {{{#!vorlage Befehl svn checkout http://localhost/svn/projekt1/trunk/ /home/user/projekt1 #checkt trunk-Zweig von projekt1 aus }}} wird der Quellcode einer Software (hier `Projekt1`) heruntergeladen und in ein Verzeichnis '''projekt1''' im Homeverzeichnis abgelegt. Alternativ lässt sich dafür auch ein grafisches Programm (siehe weiter unten) nutzen. Anschließend kann nun dort die Software kompiliert und installiert[3] werden. Dabei ist ggf. auf zusätzliche Parameter für `./configure` zu achten. = Aufsetzen eines Repositories = Zur Zeit setzt das Subversion-Paket kein Repository auf, man muss es manuell erzeugen. Eine mögliche Stelle für ein Repository ist in '''/var/local/svn'''. Dafür öffnet man ein Root-Terminal [4] und führt die folgenden Befehle aus. == Erzeugen des Verzeichnisses für lokale Verwendung ohne Apache == {{{#!vorlage Befehl mkdir -p /hier/gewünschter/pfad/svn }}} und der Repository-Datenbank: {{{#!vorlage Befehl svnadmin create --fs-type fsfs /hier/gewuenschter/pfad/svn }}} == Erzeugen des Verzeichnisses für den Webserver == {{{#!vorlage Warnung Dieses Verzeichnis darf __nicht__ in der Document Root des Webservers liegen. Es darf also nicht direkt über `http://localhost/svn` aufgerufen werden können. Wenn man dies nicht beachtet, wird bei den svn-Befehlen immer ein "301 moved permanently"-Fehler ausgegeben werden! }}} {{{#!vorlage Befehl mkdir -p /var/local/svn }}} und der Repository-Datenbank: {{{#!vorlage Befehl svnadmin create --fs-type fsfs /var/local/svn }}} Nun ist das Repository für den WWW-Server schreibbar zu machen: {{{#!vorlage Befehl chown -R www-data:www-data /var/local/svn }}} == Konfiguration von Apache2 == === Einfache Konfiguration ohne Benutzerauthentifizierung === {{{#!vorlage Hinweis Bei dieser Konfiguration handelt es sich um die Minimalkonfiguration __ohne__ jegliche Sicherheitsmechanismen. Diese Konfiguration sollte nur in vertrauenswürdigen Netzen betrieben werden. }}} In einem Editor mit Root-Rechten [5] ändert man den Inhalt der Datei '''/etc/apache2/mods-enabled/dav_svn.conf''', falls diese Datei noch nicht existiert, muss man noch "`dav_svn`" aktivieren. {{{#!vorlage Befehl a2enmod dav_svn }}} {{{#!vorlage Warnung Hiermit gibt man Lese- und Schreibrechte für jeden. Man sollte also je nach Anwendung keine geheimen Daten im Repository liegen haben. Des Weiteren sollte diese Art der Konfiguration am besten nur im privaten Bereich oder in einem vertrauenswürdigen Netz betrieben werden. Des Weiteren ist darauf zu achten, beim Bearbeiten von '''dav_svn.conf''' keine Tabs, sondern echte Leerzeichen zum Einrücken zu verwenden. }}} {{{#!code apache DAV svn SVNPath /var/local/svn }}} Danach den Webserver Apache2 neu starten {{{#!vorlage Befehl sudo /etc/init.d/apache2 restart }}} und das neue Subversion-Repository wird unter der URL `http://localhost/svn/` verfügbar sein. === Konfiguration mehrerer Repositories === {{{#!vorlage Hinweis Diese Konfiguration basiert auf der "Einfachen Konfiguration ohne Benutzerauthentifizierung" und sollte daher nur in vertrauenswürdigen Netzen betrieben werden. }}} Wer nicht nur ein Repository bereitstellen möchte, kann die Anzahl auf einfache Art und Weise nahezu beliebig erweitern. Hierzu wird sich anstatt dem Parameter `"SVNPath"` der Parameter `"SVNParentPath"` in der Datei '''/etc/apache2/mods-enabled/dav_svn.conf''' verwendet. Dieser Parameter bewirkt, dass der Apache nicht unter '''/var/local/svn/''' nach einen Repository sucht, sondern alle Repositories unterhalb des Ordners einbindet. Es ist für den reibungslosen Ablauf notwendig, dass das hier in den Beispielen genannte Verzeichnis '''/var/local/svn/''' kein Repository ist sondern nur die Ordner unterhalb dieses Verzeichnisses {{{#!vorlage Befehl mkdir -p /var/local/svn/project1 mkdir -p /var/local/svn/project2 }}} und der Repository-Datenbank: {{{#!vorlage Befehl svnadmin create --fs-type fsfs /var/local/svn/project1 svnadmin create --fs-type fsfs /var/local/svn/project2 }}} Nun sind die Repositories für den WWW-Server schreibbar zu machen: {{{#!vorlage Befehl chown -R www-data:www-data /var/local/svn }}} und die Datei '''/etc/apache2/mods-enabled/dav_svn.conf''' entsprechend abzuändern: {{{#!code apache DAV svn SVNParentPath /var/local/svn SVNListParentPath on # Notwendig für das Auflisten aller Repositories }}} Danach den Webserver Apache2 neu starten {{{#!vorlage Befehl sudo /etc/init.d/apache2 restart }}} und die neuen Subversion-Repositories werden unter der URL `http://localhost/svn/project1/`, `http://localhost/svn/project2/` etc. verfügbar sein. === Konfiguration mit Benutzerauthentifizierung === In einem Editor mit Root-Rechten [4] ändert man den Inhalt der Datei '''/etc/apache2/mods-enabled/dav_svn.conf''', falls diese Datei noch nicht existiert, muss man noch "`dav_svn`" aktivieren. {{{#!vorlage Befehl a2enmod dav_svn }}} {{{#!vorlage Warnung Hiermit gibt man Leserechte für jeden. Man sollte also je nach Anwendung keine geheimen Daten im Repository liegen haben. Möchte man auch den Lesezugriff einschränken, muss "`Require valid-user`" direkt in den "Location-Container" und der "LimitExcept-Container" kann weggelassen werden. }}} {{{#!code apache DAV svn SVNPath /var/local/svn AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/apache2/dav_svn.passwd Require valid-user }}} Danach wird eine Nutzerauthentifizierungsdatei erzeugt. Um dieser einen weiteren Benutzer hinzuzufügen, folgendes ins Terminal eingeben: [3] (der optionale Parameter `-c` löscht alle bereits bestehenden Benutzer) {{{#!vorlage Befehl sudo htpasswd /etc/apache2/dav_svn.passwd ein-Nutzer }}} Apache2 neu starten {{{#!vorlage Befehl sudo /etc/init.d/apache2 restart }}} und das neue Subversion-Repository wird unter der URL `http://localhost/svn/` verfügbar sein. Abhängig vom jeweiligen System bzw. den installierten Paketen kann beim Neustart des Apache2 der Fehler kommen ''"No apache MPM package installed"''. Dann muss man folgendes Paket installieren: {{{#!vorlage Paketinstallation apache2-mpm-prefork }}} Anschließend sollte sich der Apache2 neu starten lassen (s. oben). == Verzeichnisstruktur erstellen == In einem Terminal [3] führt man den folgenden Befehl aus: {{{#!vorlage Befehl mkdir -p /tmp/projekt1/trunk mkdir -p /tmp/projekt1/tags mkdir -p /tmp/projekt1/branches }}} Die Bezeichnung `trunk` steht für den Hauptast des Projektes. Das Verzeichnis `branches` steht für eventuelle Entwicklungszweige, das Verzeichnis `tags` dient der Speicherung von Entwicklungsständen. Die schon erstellten Dateien muss man ins trunk-Verzeichnis kopieren: {{{#!vorlage Befehl cp -R /projekt_ohne_svn/* /tmp/projekt1/trunk }}} Projekt in Subversion importieren: Für lokale Installation {{{#!vorlage Befehl svn import /tmp/projekt1 file:///hier/gewuenschter/pfad/svn/projekt1 -m "initialer Import" }}} Für den Apache {{{#!vorlage Befehl svn import /tmp/projekt1 http://localhost/svn/projekt1 -m "initialer Import" }}} Allerdings wird hier der aktuelle Login-Name verwendet. Existiert dieser nicht als Benutzer bzw. soll ein anderer verwendet werden, ist folgender Befehl auszuführen: {{{#!vorlage Befehl svn import /tmp/projekt1 http://localhost/svn/projekt1 -m "initialer Import" --username ein-Nutzer }}} == Zentrale Zugriffsbeschränkung mehrerer Projekte == In SVN gibt es zusätzlich noch die Möglichkeit, mehrere Repositories zu erstellen und diese zentral zu steuern. Jedes Repository muss in einem Unterordner des SVN-Hauptordners erstellt werden. {{{#!vorlage Befehl svnadmin create --fs-type fsfs /hier/gewuenschter/pfad/svn/projekt1 svnadmin create --fs-type fsfs /hier/gewuenschter/pfad/svn/projekt2 svnadmin create --fs-type fsfs /hier/gewuenschter/pfad/svn/projekt3 }}} Danach muss die Datei '''/etc/apache2/mods-enabled/dav_svn.conf''' angepasst werden. {{{#!code apache ... AuthzSVNAccessFile /etc/apache2/dav_svn.authz ... }}} {{{#!vorlage Warnung Sollte man diese Variante der zentralen Steuerung verwenden, muss der Bereich `"LimitExcept"` entfernt werden, sofern man nur den berechtigten Benutzern einen Zugriff gewähren will. }}} {{{#!code apache ... }}} Dafür darf nur noch der Inhalt des Bereichs stehen bleiben. {{{#!code apache ... Require valid-user ... }}} Insgesamt sieht die Konfigurationsdatei also folgendermaßen aus: {{{#!code apache DAV svn SVNPath /var/svn AuthzSVNAccessFile /etc/apache2/dav_svn.authz Require valid-user AuthType Basic AuthName "Subversion repository DESADV" AuthUserFile /etc/apache2/dav_svn.passwd }}} Bei dieser Art der Benutzerverwaltung ist ggfs. das Modul `authz_svn` einmalig zusätzlich zu aktivieren. Dies geschieht folgendermaßen: {{{#!vorlage Befehl a2enmod authz_svn }}} Im nächsten Schritt werden in der Datei '''/etc/apache2/dav_svn.authz''' die notwendigen Einstellungen vorgenommen. Dies könnte wie im folgenden Beispiel aussehen. {{{#!code apache [groups] admin = username1,username2, ... gruppe2 = username3,username4, ... [projekt1:/] @admin = rw @gruppe2 = r [projekt2:/] @gruppe2 = rw [projekt3:/] @admin = rw }}} Im Abschnitt `groups` werden die Gruppen festgelegt, den einzelnen Gruppen können mehrere Benutzer hinzugefügt werden. Einem Projekt können mehrere Gruppen zuweisen und verschiedene Rechte vergeben werden. Bei `projekt1` sind es hier die Gruppen `admin` und `gruppe2`. Die Gruppe `admin` hat Schreib- und Leserechte, `gruppe2` hingegen nur Leserechte. Wenn man einem bestimmten Benutzer Rechte für ein Projekt einrichten will, muss dies wie folgt geschehen. {{{#!code apache [groups] admin = username1,username2, ... gruppe2 = username3,username4, ... [projekt1:/] username1 = r @gruppe2 = rw ... }}} Für den Zugriff aller Benutzer und Gruppen auf ein Projekt kann eine Wildcard verwendet werden. {{{#!code apache ... [projekt1:/] * = r ... }}} Der Doppelpunkt und Slash in `projekt1` legen fest, dass die Berechtigungen ab dem Hauptverzeichnis des Repositories greifen. Will man also Benutzern und Gruppen in Unterverzeichnissen andere Rechte gewähren, gibt man einfach zusätzlich noch den zu schützenden Pfad mit an. {{{#!code apache ... [projekt2:/der/zu/schuetzende/pfad] username3 = r ... }}} Jetzt wurden dem Benutzer die zuvor gewährten Schreibrechte im `projekt2` wieder entzogen. {{{#!vorlage Hinweis Sollte kein Wert nach dem Gleichheitszeichen stehen, hat die betreffende Gruppe oder der Benutzer keine Rechte für das Projekt. }}} = Subversion-Befehle = Die Befehle müssen im Projektverzeichnis ausgeführt werden, sonst weiß Subversion nicht, was gemeint ist. {{{#!vorlage Befehl svn checkout file:///hier/gewuenschter/pfad/svn/projekt1/trunk/ /home/user/projekt1 #checkt trunk-Zweig von projekt1 aus bei lokaler Verwendung svn checkout http://localhost/svn/projekt1/trunk/ /home/user/projekt1 #checkt trunk-Zweig von projekt1 aus bei Verwendung des Apache svn diff #zeigt die Unterschiede an svn commit -m "Kommentar" #die Arbeitskopie wird auf den Server übertragen svn update #damit wird die Arbeitskopie auf die Version vom Server aktualisiert svn help #Hilfe }}} == Backup erstellen/einspielen == {{{#!vorlage Befehl svnadmin dump /var/local/svn/ > dumpfile svnadmin load /var/local/svn/ < dumpfile }}} = Subversion-Keywords = Die Keywords von Subversion dienen dazu um bspw. die aktuelle Revision eines Dokumentes anzuzeigen. Folgende sind verfügbar: * `$Id:$` - Dateiname Revision Letzte-Bearbeitung Ersteller * `$Rev:$` - Gibt die aktuelle Revision aus * `$Author:$` - Gibt den aktuellen Ersteller aus * `$Date:$` - Gibt den Zeitpunkt der letzten Bearbeitung aus Beispielausgabe {{{ /* * $Id: helloworld.c 1 2009-07-04 10:00:00Z mewis $ * $Rev: 1 $: * $Author: mewis $ * $Date: 2009-07-04 10:00:00Z (Sat, 04 Jul 2009) $ */ }}} Um den gewünschten Effekt in einem Dokument zu erreichen gibt man im Terminal[3] folgendes ein: {{{#!vorlage Befehl svn propset svn:keywords "Id Rev Author Date" helloworld.c }}} == Konfiguration Auto-Keywords == Damit jedes neue Dokument in einem Repository automatisch den gewünschten Effekt ausgibt, benötigt es eine Anpassung der Subversion-Konfiguration. Dazu die Konfigurationsdatei '''/etc/subversion/config''' in einem Editor mit Root-Rechten öffnen[4] und am Ende der Datei Folgendes einfügen: {{{#!code enable-auto-props = yes [auto-props] *.c = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL *.css = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL *.java = svn:eol-style=native; svn:keywords=Id Author Date Revision *.properties = svn:eol-style=native *.sh = svn:eol-style=native;svn:executable *.txt = svn:eol-style=native *.xml = svn:eol-style=native *.php = svn:eol-style=native; svn:keywords=Id Author Date Revision }}} Danach Apache2 neu starten: {{{#!vorlage Befehl sudo /etc/init.d/apache2 restart }}} = Desktopintegration = Dieser Abschnitt beschreibt einige Möglichkeiten, um die Nutzung von Subversion etwas komfortabler zu machen. == kdesvn == Das folgende Paket ist zusätzlich zu installieren [1]: {{{#!vorlage Paketinstallation kdesvn, universe }}} Kdesvn ist ein Programm der Desktopumgebung [:KDE:]. Es werden daher über die Abhängigkeiten weitere Pakete der KDE installiert. Das Programm wird gestartet über: * ''"K-Menü -> Entwicklung -> Graphische Oberfläche für SVN (kdesvn)"'' Falls die Fehlermeldung "PROPFIND Anfrage fehlgeschlagen" erscheint, muss ein SSL-Zertifikat eingerichtet werden. Das folgende Paket ist zusätzlich zu installieren [1]: {{{#!vorlage Paketinstallation ssl-cert }}} Dann kann das Zertifikat hiermit erstellt werden: {{{#!vorlage Befehl sudo mkdir /etc/apache2/ssl sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem }}} == RabbitVCS == Unter unity/GNOME integriert sich [:RabbitVCS:] gut in Nautilus. [[Anker(keystores)]] == Nutzung von Passwortmanagern == Subversion ermöglicht es, die Zugangsdaten zu einem Repository lokal zu speichern. Dies ist sehr praktisch, um nicht bei jedem Update, Commit oder Log das Passwort eingeben zu müssen. Standardmäßig werden die Zugangsdaten irgendwo im Homeverzeichnis gespeichert, es ist allerdings auch möglich die KDE-Brieftasche oder den Gnome-Schlüsselbund dafür zu verwenden. Dazu die Datei '''~/.subversion/config''' öffnen und im Abschnitt `[auth]` den Eintrag {{{#!code text password-stores = ... }}} mit dem entsprechenden Keystore ergänzen bzw. anpassen. Nutzung des Gnome-Schlüsselbundes: {{{#!code text password-stores = gnome-keyring }}} Nutzung der KDE-Brieftasche: {{{#!code text password-stores = kwallet }}} Eine Änderung dieser Einstellung wirkt sich zunächst nur auf neu zu speichernde Passwörter aus. Gegebenenfalls müssen alle bereits vorhandenen Passwörter gelöscht werden (Unterverzeichnis '''~/.subversion/auth'''), gefolgt von einem `svn up` (und erneuter Passworteingabe) auf allen Arbeitskopien. = svnserve = Svnserve mit einem init-Skript automatisch starten. Im folgenden init-Skript müssen mit einem Editor [4] noch die Variablen "`SVN_USER`", "`SVN_GROUP`" und "`SVN_REPO_PATH`" angepasst werden. Das Skript sollte dann unter dem Namen '''svnserve''' im Verzeichnis '''/etc/init.d/''' gespeichert werden. {{{#!code sh #!/bin/sh -e # # svnserve - brings up the svn server so anonymous users # can access svn # # Get LSB functions . /lib/lsb/init-functions . /etc/default/rcS SVNSERVE=/usr/bin/svnserve SVN_USER= SVN_GROUP= SVN_REPO_PATH=/var/local/svn # Check that the package is still installed [ -x $SVNSERVE ] || exit 0; case "$1" in start) log_begin_msg "Starting svnserve..." umask 002 if start-stop-daemon --start \ --chuid $SVN_USER:$SVN_GROUP \ --exec $SVNSERVE \ -- -d -r $SVN_REPO_PATH; then log_end_msg 0 else log_end_msg $? fi ;; stop) log_begin_msg "Stopping svnserve..." if start-stop-daemon --stop --exec $SVNSERVE; then log_end_msg 0 else log_end_msg $? fi ;; restart|force-reload) "$0" stop && "$0" start ;; *) echo "Usage: /etc/init.d/svnserve {start|stop|restart|force-reload}" exit 1 ;; esac exit 0 }}} Das Skript kann auch mit folgendem Befehl direkt in das richtige Verzeichnis heruntergeladen werden. {{{#!vorlage Befehl sudo wget -P /etc/init.d -O svnserve http://media.ubuntuusers.de/wiki/attachments/46/28/svnserve__.init }}} Nachdem das Skript nun am richtigen Platz ist muss Dieses noch ausführbar gemacht und als [:Dienste:Dienst] eingetragen werden. Hierfür sind die folgenden Befehle auszuführen {{{#!vorlage Befehl sudo chmod +x /etc/init.d/svnserve sudo update-rc.d svnserve defaults sudo /etc/init.d/svnserve start }}} = Subversion kompilieren = {{{#!vorlage Builddeps subversion }}} Subversion herunterladen und in entsprechendes Verzeichnis wechseln: {{{#!vorlage Befehl ./configure --with-ssl --enable-javahl --with-jdk=/usr/lib/jvm/java-6-openjdk make make javahl sudo make install install-javahl }}} = Links = * [http://subversion.apache.org/ Projektseite] {en} * [http://subversion.tigris.org/ Ehemalige Projektseite] {en} * [wikipedia:Apache_Subversion:Subversion] - Wikipedia * [http://svnbook.red-bean.com/ Versions-Kontrolle mit Subversion] {de} - freies Buch über Subversion * [:RabbitVCS:] - Nautilus-Plugin * [http://blog.root1024.ch/netzwerk/subversion-svn-einrichten-von-a-bis-z/ Subversion (SVN) einrichten von A bis Z] {de} - Blogbeitrag 01/2011 # tag: Versionsverwaltung, Apache