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.
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 | |
---|---|
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 | |
---|---|
Selbst wenn |
[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.