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 Implementierung flacher Checkouts in Subversion 1.5 ist
zwar gut, ein paar interessante Verhaltensweisen werden aber
nicht unterstützt. Erstens können Sie die Wirktiefe eines
Objektes der Arbeitskopie nicht verringern. Wenn Sie in einer
Arbeitskopie unendlicher Wirktiefe svn update
--set-depth empty
aufrufen, wird das nicht zur
Folge haben, dass alles bis auf das oberste Verzeichnis
verworfen wird – es wird mit einem Fehler aussteigen.
Zweitens gibt es keinen Wert, mit dem Sie angeben können,
bis in welche Tiefe ein Objekt ausdrücklich ignoriert werden
soll. Sie müssen es implizit ignorieren, indem alles andere
hineingenommen wird.