linux|n00b Linux für Ein- und Umsteiger

4Sep/100

SVN ignore

Da die vor wenigen Wochen beschriebene SVN-Integration in den Nautilus keine Möglichkeit bietet, Dateien oder Verzeichnisse zu ignorieren, hilft nur noch ein Kommandozeilenbefehl.

Angenommen dein Projekt befindet sich unter SVN-Kontrolle und du hast ein Verzeichnis file_cache/ (unterhalb eines Verzeichnisses application/) sowie ein Verzeichnis logs/, so kannst du den Inhalt beider Verzeichnisse von der SVN-Kontrolle wie folgt ausschließen:

[arvid@C64 ~]$ cd devel/meinprojekt
[arvid@C64 meinprojekt]$ svn propset svn:ignore "*" application/file_cache/
[arvid@C64 meinprojekt]$ svn propset svn:ignore "*" logs/

Der svn-propset-Befehl erwartet als Parameter also ein Muster der zu ignorierenden Datei/en (im Beispiel ein Sternchen "*" für alle Dateien) gefolgt vom Zielverzeichnis, in dem sich die zu ignorierenden Dateien befinden.

Schließlich muss die Änderung noch ins Repository eingecheckt werden.

[arvid@C64 meinprojekt]$ svn ci -m "kommentar"

Gefunden habe ich diese kurze Hilfe im Übrigen hier: devcha-Blog.

13Aug/100

SVN für eigenen Bedarf einrichten

SVN? Wofür?

Nicht nur für die Bewältigung größerer Aufgaben im Team, sondern auch für eigenes, lokales Arbeiten kann es manchmal sinnvoll sein, Dateien und Verzeichnisse zu versionieren.

Das trifft so ungefähr auf jede selbstständige Arbeit zu, bei der man Ergebnisse produziert, diese hin und wieder oder sogar stetig überarbeitet und für die man in der Lage sein möchte, den Entwicklungsprozess zu rekonstruieren und im Bedarfsfall Änderungen rückgängig zu machen. Das können z.B. Studienarbeiten, Programmierprojekte, aber auch gestalterische Tätigkeiten bei der Bildbearbeitung oder dergleichen sein.

Vor diesem Hintergrund möchte ich erläutern, wie man ein eigenes Subversion-Repository aufsetzt, mit dem Dateien unter Versionskontrolle gestellt werden können.

Vermerk zum Thema Sicherheit

Ich möchte ausdrücklich darauf hinweisen, dass die von mir geschilderte Vorgehensweise nur für den Gebrauch an einem Single-User-System geeignet ist, bei dem auf das SVN-Repository nicht über das Netzwerk zugegriffen werden soll. Ich belasse es bei Standard-Belegungen in den config-Files und Authentifizierungen lasse ich außen vor.

Mit anderen Worten gilt für diese Anleitung: Sicherheit weicht dem Komfort.

Warum? Ich hege derzeit kein Interesse, meine eigenen Entwicklungsarbeiten und meine Erzeugnisse für's Studium der Öffentlichkeit zugänglich zu machen. Deshalb beschränke ich mich beim Einrichten auf den Betrieb an einem lokalen System, auf das ohnehin nur ich Zugriff habe.

1. Installation

Zunächst solltest du SVN installieren (Paketname "subversion"). Zur Installation werden diverse Dienstprogramme mitgeliefert, von denen du auf jeden Fall auch svnadmin brauchen wirst. Im Terminal kannst du zum Beispiel mit den Befehlen

[arvid@C64 ~]$ which svn
/usr/bin/svn
[arvid@C64 ~]$ which svnadmin
/usr/bin/svnadmin

prüfen, ob die Installation erfolgreich war. Aber ich denke, da sollte es keine Probleme gegeben haben. Beide Befehle erzeugen im Übrigen lediglich eine kleine Ausgabe der Installationspfade für svn und svnadmin. Letzteres ist jenes Dienstprogramm, welches zum Konfigurieren des SVN-Repositories benötigt wird.

2. Vorüberlegungen

Bevor du loslegst, solltest du dir Gedanken darüber machen, wo du das SVN-Repository erstellen möchtest und vor Allem, wie du deine Verzeichnisstruktur organisieren möchtest. Einen kleinen Denkanstoß soll dir diesbezüglich der Abschnitt "Planung der Organisation Ihres Projektarchivs" aus dem SVN-Book bescheren.

Ich habe mich für folgendes Verzeichnislayout entschieden:

.
├── trunk
│   ├── devel
│   │   ├── meinprojekt
│   │   ├── nocheinrojekt
│   │   └── usw
│   ├── kreatief
│   │   ├── fotobearbeitung
│   │   ├── icons
│   │   └── usw
│   └── studium
│       └── usw
├── tags
└── branches

Unterhalb von trunk/ habe ich Verzeichnisse als Kategorien angelegt (devel/ für Develeopment bzw. Programmierung, kreatief/ für gestalterische Schaffensprozesse etc.). In die jeweiligen Kategorien pflege ich einzelne Projekte ein. Das kannst du allerdings vollkommen individuell halten, es gibt keine Vorschriften für die Ordnerstrukturen. Du kannst auch ganz auf die Einteilung in trunk, tags und branches sowie auf die Kategorien verzichten und zum Beispiel nur dein/e Projekt/e ins SVN-Repository stecken:

.
├── meinprojekt
├── nocheinrojekt
├── fotobearbeitung
├── icons
└── usw

Wie gesagt - das liegt ganz bei dir.

3. Verzeichnisstruktur anlegen

Um das Verzeichnislayout zu übernehmen, lege einfach ein paar Ordner in tmp/ an, wir werden sie in Kürze ins Repository übernehmen und dann wieder löschen.

[arvid@C64 ~]$ cd /tmp/
[arvid@C64 tmp]$ mkdir tmpsvn
[arvid@C64 tmp]$ mkdir tmpsvn/{trunk,tags,branches}
[arvid@C64 tmp]$ mkdir tmpsvn/trunk/{devel,kreatief,studium}

Die Projektverzeichnisse innerhalb der Kategorieverzeichnisse (wie zum Beispiel meinprojekt/ aus obiger Ordnerstruktur) lege ich nicht an, da das keine neuen Projekte sind, sondern welche, die bereits woanders gespeichert sind (das sind also schon bestehende Projekte, wir werden uns weiter unten darum kümmern). An dieser Stelle sollen uns die Kategorien genügen.

4. Repository anlegen und Struktur übernehmen

Auf ein Verzeichnis deiner Wahl erzeugst du nun mit svnadmin und dem Unterbefehl create ein neues SVN-Repository. Ich habe mich für ein Verzeichnis auf meiner externen USB-Festplatte entschieden:

[arvid@C64 tmp]$ svnadmin create /media/AUSSENPLADDE/SVN-REPO

Das Verzeichnis SVN-REPO/ wird automatisch angelegt und mit einigen notwendigen Ordnern und Dateien befüllt, die du auf keinen Fall löschen oder bearbeiten solltest (es sei denn, du weißt genau, was du tust). Jetzt kannst du die Verzeichnisstruktur übernehmen, die du eben noch unter tmp/ angelegt hast:

[arvid@C64 tmp]$ svn import tmpsvn file:///media/AUSSENPLADDE/SVN-REPO/ -m "initiales Verzeichnislayout für das SVN-Repository angelegt"
Hinzufügen     tmpsvn/trunk
Hinzufügen     tmpsvn/trunk/devel
Hinzufügen     tmpsvn/trunk/kreatief
Hinzufügen     tmpsvn/trunk/studium
Hinzufügen     tmpsvn/branches
Hinzufügen     tmpsvn/tags

Revision 1 übertragen.
[arvid@C64 tmp]$ rm -r tmpsvn/

Damit hast du bereits die allererste Revision erzeugt, als Kommentar (Parameter -m = message) hast du einen kurzen Text angegeben, der das Ganze beschreibt. Im Anschluss löscht du das temporär angelegte Verzeichnis tmpsvn/.

5. Repository auschecken

Wechsle in dein Home-Verzeichnis oder in ein anderes, wenn du deine Projektdaten nicht im Home-Verzeichnis haben möchtest und führe dann den SVN Checkout-Befehl aus:

[arvid@C64 tmp]$ cd ~
[arvid@C64 ~]$ svn co file:///media/AUSSENPLADDE/SVN-REPO/trunk/devel
Ausgecheckt, Revision 1.

Also ich beschränke mich demnach nur auf das Auschecken der Kategorie "devel" für meine Development-Projekte. Du solltest devel durch deine Kategorie oder den Namen deines Projektes austauschen, ggf. auch trunk/ weglassen (je nachdem, für welches Verzeichnislayout du dich entschieden hast). In deinem Homeverzeichnis wird nun devel/ angelegt, dort hinein kopieren wir gleich unsere Projekte aus den alten Devel-Verzeichnissen, in denen es noch keine Verionskontrolle gab.

6. Projektdaten kopieren und dem Repository hinzufügen

Wie ich schon geschrieben habe, möchte ich kein neues Projekt beginnen, sondern ein bestehendes ins SVN-Repository übertragen. Wenn du das genauso machen möchtest, dann kopiere einfach deinen Projektordner aus dem alten devel-Verzeichnis ins neue, welches wir gerade eben ausgecheckt haben.

[arvid@C64 ~]$ cp -R altes_devel_ohne_svn/meinprojekt/ devel/

Damit befindet sich meinprojekt/ jetzt unter devel/. Ein kurzer Test zeigt, dass der Kopiervorgang geklappt hat, aber dass SVN noch nichts damit anzufangen weiß (beachte das Fragezeichen an erster Stelle der Ausgabe):

[arvid@C64 ~]$ svn status devel/
?       devel/meinprojekt

Du musst also noch SVN mitteilen, dass da etwas Neues ist, was du gerne dem SVN-Repository hinzufügen möchtest:

[arvid@C64 ~]$ cd devel
[arvid@C64 devel]$ svn add meinprojekt/
A         meinprojekt
A         meinprojekt/public
A         meinprojekt/public/index.php
A         meinprojekt/public/js
A         meinprojekt/public/js/swfobject-2.2.js
A         meinprojekt/public/js/common.js
A         meinprojekt/public/js/jquery-1.4.min.js
A         meinprojekt/public/js/common.functions.js
A         meinprojekt/public/js/admin
       <..... usw. .....>

Es folgen je nach Projektgröße einige oder viele Dateien mit dem Präfix A, welcher nichts anderes bedeuted als "Added", also dem SVN hinzugefügt (aber noch nicht dem Repository!). Was nun noch fehlt, ist das Einchecken, auch Commit genannt:

[arvid@C64 devel]$ svn ci -m "meinprojekt ins Repository eingepflegt"
Hinzufügen     meinprojekt
Hinzufügen     meinprojekt/application
Hinzufügen     meinprojekt/application/Bootstrap.php
Hinzufügen     meinprojekt/application/configs
Hinzufügen     meinprojekt/application/configs/application.ini
Hinzufügen     meinprojekt/application/configs/preferences.ini
Hinzufügen     meinprojekt/application/controllers
       <..... usw. .....>
Hinzufügen     meinprojekt/public/js/swfobject-2.2.js
Übertrage Daten .........................................
Revision 2 übertragen.

Erst der Check-In-Befehl überträgt die Dateien zum Repository. Wieder hast du mit dem Parameter -m einen Kommentar angegeben. Und wieder folgt eine Liste mit all den Dateien, die du eben noch dem SVN bekannt gemacht hast. Durch das Einchecken hast du die nächste Revision erzeugt.

7. Prüfen

Du kannst nun testen, ob das Schiff wirklich sicher den Hafen erreicht hat, indem du dir einfach den SVN-Log ansiehst. Hierfür mache zuerst ein Update, anschließend lasse dir die Logs anzeigen:

[arvid@C64 devel]$ svn up
Revision 2.
[arvid@C64 devel]$ svn log
------------------------------------------------------------------------
r2 | arvid | 2010-07-20 10:44:53 +0200 (Di, 20. Jul 2010) | 1 Zeile

meinprojekt ins Repository eingepflegt
------------------------------------------------------------------------
r1 | arvid | 2010-07-20 10:07:16 +0200 (Di, 20. Jul 2010) | 1 Zeile

initiales Verzeichnislayout für das SVN-Repository angelegt
------------------------------------------------------------------------

Du siehst mit dem Log-Befehl die letzten Revisionen (neueste immer oben) inklusive der Kommentare. Offenbar verlief alles nach Plan.

8. Zusammenfassung

Die eigentliche "Magie" des Ganzen liegt in den Abschnitten 3 und 4, in denen gezeigt wird, wie du Verzeichnisstrukturen anlegst und diese in das neu erzeugte Repository übernimmst.

Alles andere danach sollte dir eventuell bereits vertraut sein, wenn du ein geübter SVN-User bist. Die Abschnitte 5 bis 7 lassen sich auch mit beliebigen Frontend-SVN-Clients erledigen, wie zum Beispiel mit einem im Nautilus integrierten SVN-Client.

Weitere Infos

Sieh dir die folgenden Seiten an, denen ich ebenfalls einige Informationen entnommen habe. Vielleicht helfen sie dir noch ein bisschen mehr für's Verständnis:

svnadmin create D:\repository\myproject
12Aug/100

SVN-Integration in den Nautilus

Im Windows-Bereich ist man sich mit ToroiseSVN seit jeher eine nahtlose Einbindung von Subversion in den Win-Explorer gewohnt.
Im Linux-Bereich muss man zumeist auf andere Tools zurückgreifen (die nicht im Dateiexplorer eingebunden werden) oder via Terminal mit dem svn-Kommando arbeiten.

Schritt 1: GnubVersion

Screenshot: GnubVersion ohne SVN Diff (Quelle: GnubVersion Projektseite)

Screenshot: GnubVersion ohne SVN Diff (Quelle: GnubVersion Projektseite)

Wer eine TortoiseSVN-ähnliche Lösung für Linux sucht und bislang noch nichts für seinen Gnome-Desktop gefunden hat, dem sei zunächst GnubVersion empfohlen. Ähnlich wie TortoiseSVN in den Windows-Dateiexplorer integriert sich GnubVersion nach dessen Installation in den Nautilus.

Also, erster Schritt: GnubVersion installieren.

Allerdings ist GnubVersion bei Weitem nicht so funktionsumfangreich wie das Windows-Pendant. Viele Funktionen sind im Grunde auch gar nicht nötig und das Wesentliche beherrscht GnubVersion ja auch, aber eine Sache fehlt: der SVN-Diff.

Schritt 2: Meld und die Nautilus-Aktionen

Um diesen Verlust auszugleichen, habe ich mir etwas Abhilfe verschafft. Folgendes wird dafür benötigt:

  • das Tool Meld (wenn ich mich recht entsinne, habe ich mir auch andere Diff-Betrachter angesehen, aber dieser gefiel mir am besten)
  • die Nautilus-Aktionen
  • und ein Skript, welches SVN mit Meld und den Nautilus-Aktionen verbinden soll (siehe Schritt 3)

Das sind die Zutaten - Wollen wir sie mal miteinander vermischen...

Die Nautilus-Aktionen lassen sich zum Beipiel in yum (dem Fedora-Paketmanager) unter dem Paketnamen "nautilus-actions" schnell finden und installieren. Das Gleiche gilt für Meld, der Paketname lautet schlicht und ergreifend "meld".

Schritt 3: Skript für Nautilus-Aktionen erstellen

Sind beide Tools installiert, folgt der spannende Teil: das Sktipt. Dieses ist zwar vergleichsweise simpel, dafür aber sehr nützlich. Zunächst der Inhalt des Skripts, eine kurze Erläuterung folgt darunter:

#!/bin/bash

# --------------------------------------------------------------------------
# Benutzung des Skripts prüfen

# Anzahl Parameter prüfen
if [ ! $# -eq 1 ]; then
 echo "svndiff benötigt genau einen Parameter, nämlich den Pfad zur Datei (wobei diese natürlich unter SVN-Kontrolle stehen muss)" | zenity --text-info --title="Fehler" --width=600 --height=400
 exit 1
fi

# --------------------------------------------------------------------------
# Variablen anlegen und Dateien prüfen

# Anzahl Wörter, die durch Slash getrennt sind
WORD_COUNT=`echo ${1} | sed 's/\// /g' | wc -w`
WORD_COUNT_PLUS_1=`expr $WORD_COUNT + 1`

# Pfad und Dateinamen ermitteln
FILE_PATH="`echo ${1} | cut -d/ -f1-${WORD_COUNT}`/"
FILE_NAME=`echo ${1} | cut -d/ -f${WORD_COUNT_PLUS_1}`

# Pfade für die SVN-Dateien zusammenstöpseln
# Vergleichsdatei aus SVN-Repository: <pfad>/.svn/text-base/<file>.svn-base
SVN_BASE_FILE="${FILE_PATH}.svn/text-base/${FILE_NAME}.svn-base"
# geänderte bzw. zu prüfende Datei <pfad><file> (kommt direkt aus dem Aufrufparameter, daher kein Zusammenstöpseln notwendig)
SVN_CHANGED_FILE=$1

# Pfade prüfen
# die SVN-Base-Datei
if [ ! -f $SVN_BASE_FILE ]; then
 echo "Datei existiert nicht: $SVN_BASE_FILE" | zenity --text-info --title="Fehler" --width=600 --height=100
 exit 1
fi
# die Datei
if [ ! -f $SVN_CHANGED_FILE ]; then
 echo "Datei existiert nicht: $SVN_CHANGED_FILE" | zenity --text-info --title="Fehler" --width=600 --height=100
 exit 1
fi

# --------------------------------------------------------------------------
# den eigentlichen Zweck des Skripts erfüllen

# meld (das Diff-Tool) starten
meld $SVN_BASE_FILE $SVN_CHANGED_FILE &

exit 0

Was passiert in dem Skript im Klartext...? Diese Frage möchte ich dir natürlich sofort beantworten.

1. Pfade ermitteln
Für die Verwendung des Skripts wird beim Aufruf ein Parameter benötigt, nämlich der Pfad zur Datei, für die ein SVN-Diff angezeigt werden soll. Die Angabe des Parameters wird im Block nach der ersten Trennlinie geprüft. Im nächsten Abschnitt wird aus dem Parameter der Verzeichnispfad vom Dateinamen getrennt. Daraus wird der Pfad erschlossen, der zur entsprechenden SVN-Base-Datei führt. Nun sind beide Pfade bekannt: Der Pfad zur eigentlichen Datei und der Pfad der zugehörigen SVN-Base.

2. Diff-Tool starten
Im letzten Block unter dem dritten Trennstrich wird das Tool Meld gestartet, dieses erhält als Parameter die Pfade der beiden Dateien. Das ist auch schon alles, was wir an dieser Stelle brauchen.

3. That's it.
Mehr passiert da auch gar nicht...

Screenshot: SVN Diff mit nautilus-actions

Screenshot: SVN Diff mit nautilus-actions

Schritt 4: Skript und Nautilus-Aktionen vermählen

Lege nun eine Textdatei an und speichere den Inhalt des oben abgebildeten Skripts darin. Pfad und Dateiname sind egal, denn Namen sind bekanntlich Schall und Rauch. Lege die Datei z.B. im Home-Verzeichnis unter ./.nautilus-actions/ ab und nenne sie svndiff (meinethalben auch "schall und rauch"). Starte dann das Programm nautilus-actions unter System > Einstellungen > Nautilus-Aktionen und füge diese Datei einfach hinzu.

Und fertig ist unser SVN-Diff.

Schritt 5: Have fun!

Wähle im Nautilus Dateien aus, die sich unter Versionskontrolle mit Subversion befinden und lasse dir via Rechtsklick auf "SVN-Diff" eben selbigen anzeigen.

Screenshot: Meld mit SVN-Diff

Screenshot: Meld mit SVN-Diff