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 zwei Möglichkeiten, um ihm mitzuteilen, welche Dateien Sie lieber nicht beachten möchten. Die eine Möglichkeit verwendet das Laufzeit-Konfigurationssystem (siehe „Laufzeit-Konfigurationsbereich“) 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. Die andere Möglichkeit nutzt Subversions Unterstützung für Verzeichnis-Eigenschaften und ist enger an den versionierten Baum gebunden, so dass hiervon jeder betroffen ist, der eine Arbeitskopie dieses Baumes besitzt. Beide dieser Möglichkeiten benutzen Dateimuster (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 Dateimustern 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) Dateimustern enthält, die Subversion benutzen soll, um ignorierbare Objekte in diesem Verzeichnis zu bestimmen. Diese Dateimuster 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.

[Anmerkung] Anmerkung

Die Unterstützung für ignorierbare Dateimuster 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 globale Liste mit Ignorier-Mustern neigt dazu, mehr eine Sache des persönlichen Geschmacks zu sein 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 Eigenschaft svn:ignore 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. [12] 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. Beispielsweise könnten Sie dies als neuen Wert für die Eigenschaft svn:ignore verwenden:

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

Wie bereits früher erwähnt, wird die Liste der zu ignorierenden Dateimuster 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 – sowohl die globalen als auch die verzeichnisgebundenen Listen – um festzustellen, welche Dateien nicht im Rahmen einer größeren rekursiven Hinzufüge- oder Importaktion in das Versionskontrollsystem 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 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 Eigenschaft svn:ignore 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.



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