Diese Dokumentation wurde zur Beschreibung der Serie 1.6.x von Subversion erstellt. Falls Sie eine unterschiedliche Version von Subversion einsetzen, sei Ihnen dringend angeraten, bei http://www.svnbook.com/ vorbeizuschauen und stattdessen die zu Ihrer Version von Subversion passende Version dieser Dokumentation heranzzuiehen.
Standardmäßig wirken die meisten Funktionen von Subversion rekursiv. Beispielsweise erzeugt svn checkout eine Arbeitskopie bestehend aus allen Dateien und Verzeichnissen, die sich im angegebenen Bereich des Projektarchivs befinden, indem es rekursiv durch den Verzeichnisbaum wandert, bis die gesamte Struktur auf Ihre lokale Platte kopiert worden ist. Subversion 1.5 führt eine Funktionalität namens Verzeichnis-Teilbäume (oder flache Checkouts) ein, die es Ihnen erlaubt, einfach eine Arbeitskopie – oder einen Teil einer Arbeitskopie – flacher als vollständig rekursiv auszuchecken, wobei die Möglichkeit besteht, nachträglich anfangs ignorierte Dateien hereinzuholen.
Nehmen wir beispielsweise an, wir hätten ein Projektarchiv mit einem Baum aus Dateien und Verzeichnissen, die die Namen von Familienmitgliedern samt Haustieren hätten. (Es ist sicherlich ein seltsames Beispiel, aber bleiben Sie dran.) Ein normaler Befehl svn checkout würde uns eine Arbeitskopie mit dem gesamten Baum geben:
$ svn checkout file:///var/svn/repos mom A mom/son A mom/son/grandson A mom/daughter A mom/daughter/granddaughter1 A mom/daughter/granddaughter1/bunny1.txt A mom/daughter/granddaughter1/bunny2.txt A mom/daughter/granddaughter2 A mom/daughter/fishie.txt A mom/kitty1.txt A mom/doggie1.txt Ausgecheckt, Revision 1. $
Lassen Sie uns nun denselben Baum noch einmal auschecken; dieses Mal jedoch sagen wir Subversion, dass wir nur das oberste Verzeichnis ohne irgendeines seine Kinder haben möchten:
$ svn checkout file:///var/svn/repos mom-empty --depth empty Ausgecheckt, Revision 1 $
Beachten Sie, dass wir unserer ursprünglichen Kommandozeile
svn checkout eine neue Option
--depth
hinzugefügt haben. Diese Option gibt es
für viele Subversion-Unterbefehle und ähnelt den Optionen
--non-recursive
(-N
) und
--recursive
(-R
). Tatsächlich
ist sie eine Kombination, Verbesserung, Nachfolge und Ablösung
der beiden älteren Optionen. Zunächst erweitert sie den Grad der
Tiefenangabe für Anwender, indem einige vorher nicht
unterstützte (oder nicht konsistent unterstützte) Tiefen
hinzugefügt wurden. Hier sind die Werte, die Sie für die
Tiefe bei einer gegebenen Subversion-Funktion angeben
können:
--depth empty
Nur das unmittelbare Argument einer Funktion verwenden, keine der darin enthaltenen Dateien und Verzeichnisse.
--depth files
Das unmittelbare Argument einer Funktion mitsamt der darin unmittelbar enthaltenen Dateien verwenden.
--depth immediates
Das unmittelbare Argument einer Funktion mitsamt der darin unmittelbar enthaltenen Dateien und Verzeichnisse verwenden. Der Inhalt dieser Verzeichnisse wird nicht berücksichtigt.
--depth infinity
Das unmittelbare Argument einer Funktion mitsamt aller darin rekursiv enthaltenen Dateien und Verzeichnisse verwenden.
Natürlich handelt es sich bei der bloßen Zusammenlegung zweier bestehender Optionen zu einer kaum um eine neue Funktionalität, die es Wert wäre, ihr einen ganzen Abschnitt dieses Buches zu widmen. Erfreulicherweise steckt hier noch mehr drin. Der Begriff der Tiefe erstreckt sich nicht nur auf die Funktionen, die Sie mit Ihrem Client ausführen, sondern auch auf die Beschreibung der Umgebungstiefe eines Angehörigen einer Arbeitskopie, nämlich die durch die Arbeitskopie dauerhaft vermerkte Tiefe dieses Objekts. Ihre Hauptstärke ist eben diese Dauerhaftigkeit – die Tatsache, dass sie anhaftet. Die Arbeitskopie merkt sich solange die Tiefe, die Sie für jedes in ihr enthaltenes Objekt wählen, bis Sie später diese Tiefenwahl ändern; standardmäßig arbeiten Subversion-Befehle auf allen vorhandenen Angehörigen einer Arbeitskopie, egal welche Tiefe für sie gewählt wurde.
Tipp | |
---|---|
Sie können die zwischengespeicherte Umgebungstiefe einer Arbeitskopie mit dem Befehl svn info überprüfen. Falls die Umgebungstiefe einen anderen Wert als die unendliche Rekursion hat, zeigt svn info eine Zeile mit dem Wert an: $ svn info mom-immediates | grep "^Depth:" Tiefe: immediates $ |
Unsere vorhergehenden Beispiele zeigten Checkouts unendlicher Tiefe (der Standard für svn checkout) sowie leerer Tiefe. Lassen Sie uns nun Beispiele für die anderen Tiefenwerte ansehen:
$ svn checkout file:///var/svn/repos mom-files --depth files A mom-files/kitty1.txt A mom-files/doggie1.txt Ausgecjheckt. Revision 1. $ svn checkout file:///var/svn/repos mom-immediates --depth immediates A mom-immediates/son A mom-immediates/daughter A mom-immediates/kitty1.txt A mom-immediates/doggie1.txt Ausgecheckt. Revision 1. $
Wie beschrieben, bedeutet jede dieser Tiefen etwas mehr als nur das Argument, aber dennoch weniger als vollständige Rekursion.
Wir haben hier zwar svn checkout als
Beispiel genommen, jedoch finden Sie die Option
--depth
auch bei vielen anderen
Subversion-Befehlen. Bei diesen anderen Befehlen stellt die
Tiefenangabe eine Möglichkeit dar, den Wirkbereich einer
Funktion auf eine bestimmte Tiefe zu begrenzen, etwa so, wie
sich die älteren Optionen --non-recursive
(-N
) und --recursive
(-R
) verhalten. Das bedeutet, dass, wenn Sie in
einer Arbeitskopie einer bestimmten Tiefe arbeiten und eine
Funktion geringerer Tiefe verlangen, sich diese Funktion auf die
geringere Tiefe beschränkt. Wir können eigentlich noch
allgemeiner werden: Wenn eine Arbeitskopie mit einer beliebigen
– sogar gemischten – Umgebungstiefe gegeben ist und
ein Subversion-Befehl mit einer gewünschten Wirktiefe aufgerufen
wird, so wird der Befehl die Umgebungstiefe der
Arbeitskopie-Objekte berücksichtigen, wobei der Wirkbereich auf
die gewünschte (oder standardmäßige) Wirktiefe beschränkt
ist.
Zusätzlich zur Option --depth
akzeptieren
die Unterbefehle svn update und svn
switch eine zweite Option, die mit Tiefe zu tun hat:
--set-depth
. Mit dieser Option können Sie die
anhaftende Tiefe eines Objektes der Arbeitskopie ändern. Sehen
Sie, was passiert, wenn wir unseren leeren Checkout nehmen und
ihn mit svn update --set-depth
schrittweise
tiefer gehen lassen:NEW-DEPTH
TARGET
$ svn update --set-depth files mom-empty A mom-empty/kittie1.txt A mom-empty/doggie1.txt Aktualisiert zu Revision 1. $ svn update --set-depth immediates mom-empty A mom-empty/son A mom-empty/daughter Aktualisiert zu Revision 1. $ svn update --set-depth infinity mom-empty A mom-empty/son/grandson A mom-empty/daughter/granddaughter1 A mom-empty/daughter/granddaughter1/bunny1.txt A mom-empty/daughter/granddaughter1/bunny2.txt A mom-empty/daughter/granddaughter2 A mom-empty/daughter/fishie1.txt Aktualisiert zu Revision 1. $
Während wir schrittweise eine größere Tiefe wählten, lieferte uns das Projektarchiv mehr Teile unseres Baums.
In unserem Beispiel arbeiteten wir nur auf der Wurzel unserer Arbeitskopie und änderten ihre Umgebungstiefe. Wir können aber auch die Umgebungstiefe irgendeines Unterverzeichnisses innerhalb der Arbeitskopie unabhängig ändern. Eine sorgfältige Verwendung dieser Fähigkeit erlaubt es uns, bestimmte Bereiche des Dateibaums der Arbeitskopie herauszustellen, während andere Teilbereiche komplett weggelassen werden. Hier ist ein Beispiel, wie wir einen Teilbereich eines Zweigs unseres Familienstammbaums aufbauen, einen anderen Zweig vollständig rekursiv darstellen und andere Teile beschnitten (nicht auf der Festplatte) lassen können.
$ rm -rf mom-empty $ svn checkout file:///var/svn/repos mom-empty --depth empty Ausgecheckt. Revision 1. $ svn update --set-depth empty mom-empty/son A mom-empty/son Aktualisiert zu Revision 1. $ svn update --set-depth empty mom-empty/daughter A mom-empty/daughter Aktualisiert zu Revision 1. $ svn update --set-depth infinity mom-empty/daughter/granddaughter1 A mom-empty/daughter/granddaughter1 A mom-empty/daughter/granddaughter1/bunny1.txt A mom-empty/daughter/granddaughter1/bunny2.txt Aktualisiert zu Revision 1. $
Glücklicherweise wird Ihre Arbeit in der Arbeitskopie nicht
komplizierter, falls Sie dort eine verzwickte Sammlung aus
Umgebungstiefen haben. Sie können lokale Änderungen in Ihrer
Arbeitskopie immer noch vornehmen, rückgängig machen, anzeigen
und übertragen, ohne neue Optionen bei den entsprechenden
Unterbefehlen angeben zu müssen (auch nicht
--depth
und --set-depth
).
Sogar svn update funktioniert wie dort, wo
keine bestimmte Tiefe angegeben worden ist – es
aktualisiert die Argumente in der Arbeitskopie, die vorhanden
sind, wobei deren anhaftende Tiefen berücksichtigt
werden.
An dieser Stelle könnten Sie sich vielleicht fragen:
„Was soll das Ganze? Wann brauche ich das?“
Ein Szenario, bei dem diese Funktionalität sehr nützlich ist,
steht in Zusammenhang mit einer bestimmten Organisation des
Projektarchivs, besonders dann, wenn Sie viele in Beziehung
stehende oder gemeinsam abhängige Projekte oder Software-Module
als Geschwister an einem einzelnen Ort des Projektarchivs
untergebracht haben (trunk/project1
,
trunk/project2
,
trunk/project3
, usw.). In solchen
Szenarios könnte es vorkommen, dass Sie persönlich nur eine
handvoll dieser Projekte interessiert – vielleicht ein
Hauptprojekt sowie einige andere Module, von denen es abhängt.
Sie könnten zwar individuelle Arbeitskopien dieser Teile
auschecken, jedoch wären diese Arbeitskopien disjunkt und es
könnte umständlich sein, Funktionen gleichzeitig auf einigen
oder allen anzuwenden. Die Alternative ist die Verwendung der
Funktionalität von Verzeichnis-Teilbäumen, bei dem eine einzelne
Arbeitskopie erstellt wird, die nur diejenigen Module enthält,
die Sie interessieren. Sie würden das gemeinsame
Elternverzeichnis mit einer leeren Tiefe auschecken und
anschließend die von Ihnen gewünschten Objekte mit unendlicher
Tiefe, wie im vorhergehenden Beispiel gezeigt. Sehen Sie es wie
ein Opt-In-System für Angehörige einer Arbeitskopie.
Die ursprüngliche (Subversion 1.5) Implementierung flacher
Checkouts war zwar gut, unterstützte aber nicht die Verringerung
der Wirktiefe von Objekten der Arbeitskopie. Subversion 1.6
behebt dieses Problem. Wenn Sie beispielsweise in einer
Arbeitskopie unendlicher Wirktiefe svn update
--set-depth empty
aufrufen, wird das zur Folge
haben, dass alles bis auf das oberste Verzeichnis verworfen
wird.[18] Subversion 1.6 führt darüber hinaus
einen weiteren unterstützten Wert für die Option
--set-depth
ein: exclude
.
Die Verwendung von --set-depth exclude
mit
svn update führt dazu, dass das Ziel der
Aktualisierung vollständig aus der Arbeitskopie entfernt wird
– ein Zielverzeichnis würde nicht einmal leer
hinterlassen. Das ist besonders dann hilfreich, wenn es mehr
Dinge gibt, die Sie in der Arbeitskopie behalten wollen als
Dinge, die Sie nicht mehr haben
möchten.
Betrachten Sie ein Verzeichnis mit hunderten von
Unterverzeichnissen, von denen Sie eins lieber nicht in Ihrer
Arbeitskopie hätten. Beim „additiven“ Ansatz mit
Teilbäumen könnten Sie das Verzeichnis mit einer leeren Tiefe
auschecken und dann explizit (mit svn update
--set-depth infinity
) für jedes Unterverzeichnis die
Wirktiefe hochsetzen, mit Ausnahme desjenigen, welches Sie nicht
haben möchten.
$ svn checkout http://svn.example.com/repos/many-dirs --depth empty … $ svn update --set-depth infinity many-dirs/wanted-dir-1 … $ svn update --set-depth infinity many-dirs/wanted-dir-2 … $ svn update --set-depth infinity many-dirs/wanted-dir-3 … ### usw., usw., ...
Das könnte recht lästig werden, insbesonders, da Sie nicht einmal Ansätze dieser Verzeichnisse in Ihrer Arbeitskopie haben, mit denen Sie arbeiten könnten. Eine solche Arbeitskopie hätte auch noch eine weitere Eigenschaft, die Sie nicht erwarten oder wünschen würden: falls jemand anderes neue Unterverzeichnisse in diesem Oberverzeichnis erzeugen würde, bekämen Sie bei der Aktualisierung der Arbeitskopie davon nichts mit.
Mit Subversion 1.6 könnten Sie einen anderen Ansatz wählen.
Zunächst würden Sie das Verzeichnis vollständig auschecken. Dann
würden Sie svn update --set-depth exclude
für das Unterverzeichnis aufrufen, das Sie nicht haben
möchten.
$ svn checkout http://svn.example.com/repos/many-dirs … $ svn update --set-depth exclude many-dirs/unwanted-dir D many-dirs/unwanted-dir $
Dieser Ansatz hinterlässt Ihre Arbeitskopiel mit demselben Inhalt wie der erste Ansatz, jedoch würden beim Aktualisieren auch alle neuen Unterverzeichnisse im obersten Verzeichnis auftauchen. Der Nachteil bei diesem Ansatz ist, dass Sie ein komplettes Unterverzeichnis auschecken müssen, das Sie gar nicht haben wollen, nur damit Sie Subversion sagen können, dass Sie es nicht benötigen. Es kann sogar unmöglich sein, falls das Unterverzeichnis zu groß für Ihre Platte ist (was vielleicht der eigentliche Grund ist, warum Sie es nicht in der Arbeitskopie haben möchten).
Anmerkung | |
---|---|
Obwohl die Funktion des Ausschließens eines Objektes aus
der Arbeitskopie an den Befehl svn update
gehängt wurde, haben Sie vielleicht bemerkt, dass die Ausgabe
von |
In einer solchen Situation könnten Sie über einen
Kompromissansatz nachdenken. Checken Sie zunächst das oberste
Verzeichnis mit --depth immediates
aus.
Schließen Sie dann das Verzeichnis, das Sie nicht benötigen, mit
svn update --set-depth exclude
aus.
Erweitern Sie schließlich die Wirktiefe für alle verbleibenden
Objekte auf unendliche Tiefe, was ziemlich einfach sein sollte,
da Sie alle in Ihrer Shell adressierbar sind.
$ svn checkout http://svn.example.com/repos/many-dirs --depth immediates … $ svn update --set-depth exclude many-dirs/unwanted-dir D many-dirs/unwanted-dir $ svn update --set-depth infinity many-dirs/* … $
Auch hier wird Ihre Arbeitskopie denselben Inhalt haben wie in den vorhergegangenen beiden Szenarien. Aber nun werden Sie jede neu hinzugefügte Datei oder jedes neu hinzugefügte Verzeichnis beim Aktualisieren – mit leerer Tiefe – mitbekommen. Dann können Sie sich entscheiden, was mit solchen neu erscheinenden Objekten geschehen soll: in unendliche Tiefe expandieren oder vollständig ausschließen.
[18] Natürlich auf eine sichere Art und Weise. Wie in anderen Situationen lässt Subversion Dateien, die Sie bearbeitet haben oder die nicht versioniert sind, auf der Platte.