ubuntuusers.de

Subversion

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

./subversion_logo.png Subversion 🇬🇧 (SVN) ist ein Versionsverwaltungsystem. Diese Anleitung beschreibt, wie man Subversion zusammen mit der Apache-Schnittstelle WebDAV aufsetzt. Alternativ kann man einen SVN-Server auch ohne Apache aufsetzen.

Installation

Die folgenden Pakete sind zu installieren [1]:

  • subversion

  • libapache2-svn (universe, optional für den Webserver nötig)

Paketliste zum Kopieren:

sudo apt-get install subversion libapache2-svn 

Oder mit apturl installieren, Link: apt://subversion,libapache2-svn

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

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

mkdir -p /hier/gewünschter/pfad/svn 

und der Repository-Datenbank:

svnadmin create --fs-type fsfs /hier/gewuenschter/pfad/svn 

Erzeugen des Verzeichnisses für den Webserver

Achtung!

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!

mkdir -p /var/local/svn 

und der Repository-Datenbank:

svnadmin create --fs-type fsfs /var/local/svn 

Nun ist das Repository für den WWW-Server schreibbar zu machen:

chown -R www-data:www-data /var/local/svn 

Konfiguration von Apache2

Einfache Konfiguration ohne Benutzerauthentifizierung

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.

a2enmod dav_svn 

Achtung!

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.

1
2
3
4
     <Location /svn>
       DAV svn
       SVNPath /var/local/svn
     </Location>

Danach den Webserver Apache2 neu starten

sudo /etc/init.d/apache2 restart 

und das neue Subversion-Repository wird unter der URL http://localhost/svn/ verfügbar sein.

Konfiguration mehrerer Repositories

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

mkdir -p /var/local/svn/project1
mkdir -p /var/local/svn/project2 

und der Repository-Datenbank:

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:

chown -R www-data:www-data /var/local/svn 

und die Datei /etc/apache2/mods-enabled/dav_svn.conf entsprechend abzuändern:

1
2
3
4
5
     <Location /svn>
       DAV svn
       SVNParentPath /var/local/svn
       SVNListParentPath on # Notwendig für das Auflisten aller Repositories
     </Location>

Danach den Webserver Apache2 neu starten

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.

a2enmod dav_svn 

Achtung!

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
     <Location /svn>
       DAV svn
       SVNPath /var/local/svn
       AuthType Basic
       AuthName "Subversion repository"
       AuthUserFile /etc/apache2/dav_svn.passwd
       <LimitExcept GET PROPFIND OPTIONS REPORT>
         Require valid-user
       </LimitExcept>
     </Location>

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)

sudo htpasswd /etc/apache2/dav_svn.passwd ein-Nutzer 

Apache2 neu starten

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:

  • apache2-mpm-prefork

Paketliste zum Kopieren:

sudo apt-get install apache2-mpm-prefork 

Oder mit apturl installieren, Link: apt://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:

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:

cp -R /projekt_ohne_svn/* /tmp/projekt1/trunk 

Projekt in Subversion importieren:

Für lokale Installation

svn import /tmp/projekt1 file:///hier/gewuenschter/pfad/svn/projekt1 -m "initialer Import" 

Für den Apache

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:

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.

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.

1
2
3
4
5
 <Location /svn>
   ...      
   AuthzSVNAccessFile /etc/apache2/dav_svn.authz
  ...
  </Location>

Achtung!

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.

1
2
3
<LimitExcept GET PROPFIND OPTIONS REPORT>
  ...
</LimitExcept>

Dafür darf nur noch der Inhalt des Bereichs stehen bleiben.

1
2
3
4
5
<Location /svn>
   ...   
   Require valid-user
   ...
</Location>

Insgesamt sieht die Konfigurationsdatei also folgendermaßen aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<Location /svn>
       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
</Location>

Bei dieser Art der Benutzerverwaltung ist ggfs. das Modul authz_svn einmalig zusätzlich zu aktivieren. Dies geschieht folgendermaßen:

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
      [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.

1
2
3
4
5
6
7
8
9
      [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.

1
2
3
4
      ...
      [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.

1
2
3
4
      ...
      [projekt2:/der/zu/schuetzende/pfad]
      username3 = r
      ...

Jetzt wurden dem Benutzer die zuvor gewährten Schreibrechte im projekt2 wieder entzogen.

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.

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

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:

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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:

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]:

  • kdesvn (universe)

Paketliste zum Kopieren:

sudo apt-get install kdesvn 

Oder mit apturl installieren, Link: apt://kdesvn

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]:

  • ssl-cert

Paketliste zum Kopieren:

sudo apt-get install ssl-cert 

Oder mit apturl installieren, Link: apt://ssl-cert

Dann kann das Zertifikat hiermit erstellt werden:

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.

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

1
password-stores = ...

mit dem entsprechenden Keystore ergänzen bzw. anpassen.

Nutzung des Gnome-Schlüsselbundes:

1
password-stores = gnome-keyring

Nutzung der KDE-Brieftasche:

1
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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/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=<benutzername>
SVN_GROUP=<gruppe>
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.

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 Dienst eingetragen werden. Hierfür sind die folgenden Befehle auszuführen

sudo chmod +x /etc/init.d/svnserve
sudo update-rc.d svnserve defaults
sudo /etc/init.d/svnserve start 

Subversion kompilieren

Befehl zum Installieren der Build-Abhängigkeiten:

sudo apt-get build-dep subversion 

sudo aptitude build-depends subversion 

Subversion herunterladen und in entsprechendes Verzeichnis wechseln:

./configure --with-ssl --enable-javahl --with-jdk=/usr/lib/jvm/java-6-openjdk
make
make javahl
sudo make install install-javahl 

Diese Revision wurde am 10. Februar 2020 09:40 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Versionsverwaltung, Apache