Dieser Text befindet sich gegenwärtig in Bearbeitung, unterliegt ständigen Änderungen und kann dadurch nicht stets akkurat irgendeine freigegebene Version der Software Apache™ Subversion® beschreiben. Das Speichern dieser Seite als Lesezeichen oder andere auf diese Seite zu verweisen, ist keine so gute Idee. Besuchen Sie http://www.svnbook.com/, um stabile Versionen dieses Buchs zu erhalten.

Ignorieren unversionierter Objekte

Es besteht in jeder gegebenen Arbeitskopie die Wahrscheinlichkeit, dass sich neben all den versionierten Dateien und Verzeichnissen auch andere Dateien und Verzeichnisse befinden, die weder versioniert sind noch versioniert werden sollen. Texteditoren müllen Arbeitskopien mit Sicherungskopien zu, Software-Compiler erzeugen Zwischen-, oder gar Zieldateien, die Sie normalerweise nie versionieren würden. Auch Benutzer selbst legen verschiedene andere Dateien und Verzeichnisse dort ab, wo es ihnen passt, oft in versionskontrollierten Arbeitskopien.

Es ist albern, anzunehmen, dass Arbeitskopien von Subversion irgendwie immun gegen diese Art von Durcheinander und Verunreinigung seien. Tatsächlich sieht es Subversion als ein Feature an, dass seine Arbeitskopien lediglich gewöhnliche Verzeichnisse sind, genau wie unversionierte Dateibäume. Allerdings können diese nicht zu versionierenden Dateien und Verzeichnisse bisweilen Ärger für Subversion-Benutzer machen. Da beispielsweise die Befehle svn add und svn import standardmäßig rekursiv arbeiten und nicht wissen, welche der Dateien im Baum Sie versionieren möchten und welche nicht, ist es leicht möglich, dass etwas unbeabsichtigt unter Versionskontrolle gebracht wird. Und weil svn status standardmäßig jedes interessante Objekt einer Arbeitskopie aufzeigt – inklusive unversionierter Dateien und Verzeichnisse – kann dessen Ausgabe gerade dort ziemlich verrauscht sein, wo sich viele dieser Dinge befinden.

Also bietet Ihnen Subversion mehrere Möglichkeiten, wie Sie ihm mitteilen können, welche Dateien Sie lieber nicht beachten möchten. Die eine Möglichkeit verwendet das Laufzeit-Konfigurationssystem (siehe „Laufzeit-Konfigurations-Bereich“) und wirkt sich deshalb auf alle Funktionen von Subversion aus, die diese Laufzeit-Einstellungen verwenden – im Allgemeinen diejenigen, die auf einem bestimmten Rechner oder durch einen bestimmten Benutzer ausgeführt werden. Zwei weitere Methoden nutzen Subversions Unterstützung für Verzeichnis-Eigenschaften und sind enger an den versionierten Baum gebunden, so dass hiervon jeder betroffen ist, der eine Arbeitskopie dieses Baumes besitzt. Alle dieser Möglichkeiten verwenden Dateinamen-Muster (Ketten aus normalen Zeichen und solchen mit besonderer Bedeutung, die mit Dateinamen verglichen werden), um zu entscheiden, welche Dateien ignoriert werden können.

Das Laufzeit-Konfigurationssystem von Subversion stellt eine Option global-ignores zur Verfügung, dessen Wert eine Sammlung von Dateinamen-Mustern ist, die durch Leerraum getrennt sind. Der Subversion-Client vergleicht diese Muster sowohl mit den Dateinamen der unter Versionskontrolle zu bringenden Kandidaten als auch mit den Namen der unversionierten Dateien, die svn status erkennt. Falls der Name irgendeiner Datei zu einem Muster passt, verhält sich Subversion grundsätzlich so, als würde die Datei gar nicht vorhanden sein. Das ist wirklich nützlich für die Sorte von Dateien, die Sie fast nie versionieren möchten, etwa Sicherheitskopien von Editoren wie die *~- und .*~-Dateien von Emacs.

Wenn die Eigenschaft svn:ignore an einem versionierten Verzeichnis auftritt, wird erwartet, dass der Wert eine Liste von (durch Zeilenvorschübe getrennten) Dateinamen-Mustern enthält, die Subversion benutzen soll, um ignorierbare Objekte in demselben Verzeichnis zu bestimmen. Diese Dateinamen-Muster setzen nicht jene außer Kraft, die in der Laufzeit-Konfigurations-Option global-ignores gefunden werden, sondern werden an deren Liste angehängt. An dieser Stelle lohnt es sich, noch einmal darauf hinzuweisen, dass, anders als bei der Option global-ignores, die Muster der Eigenschaft svn:ignore nur für das Verzeichnis gelten, an dem die Eigenschaft gesetzt ist, auch nicht für irgendein Unterverzeichnis. Mit der Eigenschaft svn:ignore kann Subversion leicht angewiesen werden, Dateien zu ignorieren, die in diesem Verzeichnis der Arbeitskopie eines jeden Benutzers mit großer Wahrscheinlichkeit auftreten, so wie Compiler-Ausgaben oder – um ein Beispiel zu bringen, das diesem Buch angebrachter ist – die HTML-, PDF- oder PostScript-Dateien, die als Ergebnis der Umwandlung der DocBook-XML-Quelltext-Dateien in ein lesbareres Format erzeugt werden.

Subversion 1.8 stellt eine mächtigere Version der Eigenschaft svn:ignore zur Verfügung, die Eigenschaft svn:global-ignores. So wie die Eigenschaft svn:ignore, kann svn:global-ignores nur auf einem Verzeichnis gesetzt werden und enthält Dateinamen-Muster, die Subversion verwendet, um festzustellen, welche Objekte es ignorieren kann.[22] Diese Muster zum Ignorieren werden außerdemm an alle Muster gehängt, die in der Laufzeit-Konfigurations-Option global-ignores definiert sind, zusammen mit eventuellen Mustern, die mit svn:ignore definiert wurden. Anders als bei svn:ignore ist die Eigenschaft svn:global-ignores jedoch vererbbar[23] und wird auf alle Pfade unterhalb des Verzeichnisses auf dem die Eigenschaft gesetzt ist angewendet, nicht nur auf die unmittelbaren Kinder des Verzeichnisses.

[Anmerkung] Anmerkung

Die Unterstützung für ignorierbare Dateinamen-Muster in Subversion erstreckt sich lediglich auf die einmalige Handlung, unversionierte Dateien und Verzeichnisse unter Versionskontrolle zu stellen. Sobald ein Objekt unter Kontrolle von Subversion ist, haben die Ignorier-Muster keine Auswirkungen mehr auf das Objekt. Mit anderen Worten: erwarten Sie nicht, dass Subversion die Übertragung von Änderungen verhindert, die Sie an einer versionierten Datei vorgenommen haben, nur weil der Name dieser Datei auf ein Ignorier-Muster passt – Subversion beachtet stets alle seine versionierten Objekte.

Die Ignorier-Muster in der Laufzeit-Konfigurations-Option global-ignores Liste mit neigen dazu, mehr eine Sache des persönlichen Geschmacks zu sein[24] und richtet sich eher nach der Werkzeugkette eines Benutzers als nach den Bedürfnissen einer bestimmten Arbeitskopie im einzelnen. Deshalb konzentriert sich der Rest dieses Abschnitts auf die Eigenschaften svn:ignore sowie svn:global-ignores und ihre Verwendung.

Angenommen, Sie haben die folgende Ausgabe von svn status:

$ svn status calc
 M      calc/button.c
?       calc/calculator
?       calc/data.c
?       calc/debug_log
?       calc/debug_log.1
?       calc/debug_log.2.gz
?       calc/debug_log.3.gz

In diesem Beispiel haben Sie einige Änderungen an Eigenschaften von button.c vorgenommen, aber Sie haben in Ihrer Arbeitskopie auch einige unversionierte Dateien: das neueste Programm calculator, das Sie aus Ihrem Quelltext compiliert haben, eine Quelltextdatei namens data.c und eine Menge von Protokolldateien zur Fehlersuche. Sie wissen, dass das Build-System stets ein Programm calculator erzeugt.[25] Und Sie wissen, das die Testumgebung immer diese Protokolldateien hinterlässt. Das trifft auf alle Arbeitskopien dieses Projektes zu, nicht nur auf Ihre eigene. Und Sie wissen, dass Sie kein Interesse daran haben, diese Dinge bei jedem Aufruf von svn status zu sehen, Sie sind sich auch ziemlich sicher, dass sich andere auch nicht dafür interessieren. Also rufen Sie svn propedit svn:ignore calc auf, um dem Verzeichnis calc ein paar Ignorier-Muster hinzuzufügen.

$ svn propget svn:ignore calc
calculator
debug_log*
$

Nach dem Hinzufügen dieser Eigenschaft haben Sie nun eine Eigenschafts-Änderung für das Verzeichnis calc. Beachten Sie jedoch, was sonst noch anders an Ihrer svn status-Ausgabe ist:

$ svn status
 M      calc
 M      calc/button.c
?       calc/data.c

Nun fehlt der überflüssige Müll in der Ausgabe! Das compilierte Programm calculator und all diese Protokolldateien befinden sich immer noch in Ihrer Arbeitskopie; Subversion erinnert Sie nur nicht mehr ständig daran, dass sie vorhanden und unversioniert sind. Und nachdem nun der ganze Lärm aus der Anzeige verschwunden ist, verbleiben die fesselnderen Objekte – wie z.B. die Quelltextdatei data.c, die Sie wahrscheinlich vergessen hatten, unter Versionskontrolle zu stellen.

Natürlich ist dieser kompaktere Bericht des Zustandes Ihrer Arbeitskopie nicht der einzig verfügbare. Falls Sie wirklich die ignorierten Dateien im Bericht sehen möchten, können Sie Subversion die Option --no-ignore mitgeben:

$ svn status --no-ignore
 M      calc
 M      calc/button.c
I       calc/calculator
?       calc/data.c
I       calc/debug_log
I       calc/debug_log.1
I       calc/debug_log.2.gz
I       calc/debug_log.3.gz

Alle Ihre vorher versteckten unversionierten Pfade werden wieder angezeigt, nun jedoch mit dem Status 'I' Ignoriert. Aber, Moment, was ist mit wip.1.diff? Die Eigenschaft svn:ignore auf calc beinhaltet keine Muster, die diesem Dateinamen entsprechen, also warum wird er ignoriert?[26] Die Antwort liegt in der dritten Methode, nach der Subversion unversionierte Pfade außer Acht lassen kann, die vererbbare Eigenschaft svn:global-ignores. Wenn Sie den Unterbefehl svn propget mit der Option --show-inherited-props verwenden, sehen Sie, dass die Eigenschaft svn:global-ignores auf der Wurzel der Arbeitskopie gesetzt ist, und sie definiert tatsächlich ein passendes Muster zum Ignorieren.

$ svn pg svn:global-ignores calc -v --show-inherited-props
Geerbte Eigenschaften von »calc«,
geerbt von ».«:
  svn:global-ignores
    *.diff
    *.patch

Wie bereits früher erwähnt, wird die Liste der zu ignorierenden Dateinamen-Muster auch von svn add und svn import verwendet. Beide dieser Befehle haben zur Folge, dass Subversion damit beginnt, eine Menge von Dateien und Verzeichnissen zu verwalten. Statt den Benutzer zu zwingen, die Dateien aus einem Dateibaum auszuwählen, die unter Versionskontrolle gestellt werden sollen, verwendet Subversion die Ignorier-Muster – die globalen, die verzeichnisgebundenen und die ererbten Listen – um festzustellen, welche Dateien nicht im Rahmen einer größeren rekursiven Hinzufüge- oder Importaktion in das Versions-Kontroll-System gebracht werden sollen. Auch hier können Sie wieder die Option --no-ignore verwenden, um Subversion mitzuteilen, die Ignorier-Listen zu ignorieren und auf allen vorhandenen Dateien und Verzeichnissen zu arbeiten.

[Tipp] Tipp

Selbst wenn svn:ignore oder svn:global-ignores gesetzt ist, könnten Sie Probleme bekommen, falls Sie Shell-Jokerzeichen in einem Befehl verwenden. Shell-Jokerzeichen werden zu einer expliziten Liste aus Zielobjekten erweitert, bevor Subversion sie bearbeitet, so dass der Aufruf von svn SUBCOMMAND * genau so funktioniert wie der Aufruf svn SUBCOMMAND file1 file2 file3 …. Im Fall des Befehls svn add hat das einen ähnlichen Effekt, wie die Option --no-ignore zu übergeben. Statt Jokerzeichen zu benutzen sollten Sie also svn add --force . verwenden, um eine größere Menge unversionierter Dinge für die Versionskontrolle vorzumerken. Das ausdrückliche Ziel stellt sicher, dass das aktuelle Verzeichnis nicht übersehen wird, weil es schon lange unter Versionskontrolle ist, und die Option --force veranlasst Subversion, sich durch dieses Verzeichnis zu arbeiten und unversionierte Dateien hinzuzufügen, wobei die Eigenschaften svn:ignore sowie svn:global-ignores und die Laufzeit-Konfigurations-Variable global-ignores berücksichtigt werden. Stellen Sie sicher, dass Sie dem Befehl svn add auch die Option --depth files mitgeben, falls Sie zum Hinzufügen kein vollständig rekursives Durchwandern wünschen.



[22] Die zu ignorierenden Muster der Eigenschaft svn:global-ignores können durch Leerzeichen, Zeilentrenner oder Tabulatoren getrennt sein (ähnlich der Laufzeit-Konfigurations-Option global-ignores), nicht nur Zeilentrenner (wie mit der Eigenschaft svn:ignore).

[23] Natürlich wird nur ein Client der Version 1.8 oder neuer die Vererbbarkeit und die besondere Bedeutung der Eigenschaft svn:global-ignores berücksichtigen!

[24] Abgesehten vom persönlichen Geschmack, falls Sie die Laufzeit-Konfigurations-Option global-ignores nicht explizit setzen – entweder auf die von Ihnen bevorzugte Menge von Mustern oder die leere Zeichenkette – verwendet Subversion einen Standardwert. Siehe unter dem Eintrag zu global-ignores in „Allgemeine Konfiguration“

[25] Ist das nicht der eigentliche Zweck eines Build-Systems?

[26] Wir nehmen an, dass Sie keine passendes Muster irgendwo in ihrer global-ignores Laufzeit-Konfiguration haben.