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.
Ein weiterer verbreiteter Begriff in der Versionskontrolle ist ein Tag. Ein Tag ist lediglich eine „Momentaufnahme“ eines Projekts. In Subversion scheint dieses Konzept bereits überall vorhanden zu sein. Jede Revision im Projektarchiv ist genau das – eine Momentaufnahme des Dateisystems nach einer Übergabe.
Allerdings möchten Menschen häufig sprechendere Namen für
Tags vergeben, wie etwa release-1.0
. Und sie
möchten Momentaufnahmen kleinerer Unterverzeichnisse des
Dateisystems erstellen. Schließlich ist es nicht gerade einfach,
sich daran zu erinnern, dass Release 1.0 einer Software ein
bestimmtes Unterverzeichnis der Revision 4822 ist.
Wieder einmal hilft Ihnen svn copy bei
der Arbeit. Wenn Sie eine Momentaufnahme von
/calc/trunk
machen wollen, genau so, wie
es in der Revision HEAD
aussieht, machen
Sie davon eine Kopie:
$ svn copy http://svn.example.com/repos/calc/trunk \ http://svn.example.com/repos/calc/tags/release-1.0 \ -m "Ein Tag für die Ausgabe 1.0 des 'calc' Projektes anlegen." Revision 902 übertragen.
Dieses Beispiel geht davon aus, dass ein Verzeichnis
/calc/tags
bereits besteht. (Falls nicht,
können Sie es mit svn mkdir erstellen.)
Nach Abschluss der Kopie ist das neue Verzeichnis
release-1.0
für immer eine Momentaufnahme
des Verzeichnisses /trunk
in der Revision
HEAD
zum Zeitpunkt, an dem Sie die Kopie
erstellt haben. Natürlich können Sie auch angeben, welche
Revision Sie genau kopieren möchten, für den Fall, dass jemand
anderes Änderungen an das Projekt übergeben haben könnte,
während Sie nicht hingeschaut haben. Wenn Sie also wissen,
dass Revision 901 von /calc/trunk
genau
die Momentaufnahme ist, die Sie möchten, können Sie sie mit
der Option -r 901
an den Befehl svn
copy übergeben.
Moment mal: ist die Erstellung eines Tags nicht dasselbe Vorgehen wie bei der Erstellung eines Zweigs? Ja, es ist es tatsächlich. In Subversion gibt es keinen Unterschied zwischen einem Tag und einem Zweig. Beides sind gewöhnliche Verzeichnisse, die durch Kopieren erzeugt werden. Genauso wie bei Zweigen, ist der einzige Grund warum ein kopiertes Verzeichnis ein „Tag“ ist, weil Menschen sich entschieden haben, es so zu betrachten: Solange niemand etwas an das Verzeichnis übergibt, bleibt es für immer eine Momentaufnahme. Wenn jemand damit beginnt, etwas dorthin zu übergeben, wird es ein Zweig.
Wenn Sie ein Projektarchiv verwalten, gibt es zwei Ansätze für den Umgang mit Tags. Der erste Ansatz ist „Hände weg“: Als Vereinbarung im Projekt entscheiden Sie, wohin Sie Ihre Tags kopieren möchten; stellen Sie sicher, dass alle Benutzer wissen, wie sie ihre zu kopierenden Verzeichnisse behandeln sollen, d.h., stellen Sie sicher, dass sie nichts dorthin übergeben. Der zweite Ansatz ist etwas paranoider: Sie können eins der Zugriffskontrollskripte verwenden, die mit Subversion ausgeliefert werden, um zu verhindern, dass irgendjemand etwas anderes im Tag-Bereich macht, als dort neue Kopien zu erzeugen (siehe Kapitel 6, Konfiguration des Servers). Der paranoide Ansatz ist normalerweise nicht notwendig. Falls ein Benutzer versehentlich eine Änderung an ein Tag-Verzeichnis übergeben hat, können Sie die Änderung einfach rückgängig machen, wie im vorhergehenden Abschnitt beschrieben. Schließlich handelt es sich um Versionskontrolle!
Manchmal möchten Sie vielleicht eine „Momentaufnahme“ machen, die komplizierter ist als ein einzelnes Verzeichnis mit einer einzigen Revision.
Stellen Sie sich beispielsweise vor, Ihr Projekt sei viel
größer als unser calc
Beispiel: Nehmen
wir an, es enthalte eine große Zahl von Unterverzeichnissen
und viel mehr Dateien. Während Ihrer Arbeit könnte es sein,
dass Sie sich entscheiden, eine Arbeitskopie anzulegen, die
bestimmte Merkmale und Fehlerbehebungen beinhaltet. Sie können
dies hinbekommen, indem Sie selektiv Dateien oder
Verzeichnisse auf bestimmte Revisionen zurückdatieren (unter
Verwendung von svn update mit der Option
-r
), indem Sie Dateien und Verzeichnisse auf
bestimmte Zweige umschalten (mit svn
switch) oder sogar, indem Sie ein paar lokale
Änderungen vornehmen. Wenn Sie fertig sind, ist Ihre
Arbeitskopie ein Mischmasch aus Projektarchiv-Quellen
verschiedener Revisionen. Nach dem Testen wissen Sie jedoch,
dass das genau die Kombination ist, die Sie mit einem Tag
versehen möchten.
Nun ist es an der Zeit, eine Momentaufnahme zu machen. Einen URL auf einen anderen zu kopieren hilft hier nicht weiter. In diesem Fall möchten Sie eine Momentaufnahme der exakten Anordnung Ihrer Arbeitskopie machen und sie im Projektarchiv speichern. Glücklicherweise besitzt svn copy vier verschiedene Anwendungsfälle (über die Sie in Kapitel 9, Die vollständige Subversion Referenz nachlesen können), zu denen auch die Fähigkeit gehört, einen Arbeitskopie-Baum ins Projektarchiv zu kopieren:
$ ls my-working-copy/ $ svn copy my-working-copy \ http://svn.example.com/repos/calc/tags/mytag \ -m "Ein Tag für den Zustand meines Arbeitsverzeichnisses anlegen." Revision 940 übertragen.
Nun gibt es ein neues Verzeichnis im Projektarchiv,
/calc/tags/mytag
, das eine exakte
Momentaufnahme Ihrer Arbeitskopie ist – gemischte
Revisionen, URLs, lokale Änderungen, usw.
Andere Benutzer haben interessante Anwendungsfälle für diese Fähigkeit von Subversion gefunden. Manchmal gibt es Situationen, in denen Sie ein paar lokale Änderungen in Ihrer Arbeitskopie gemacht haben, die ein Mitarbeiter sehen soll. Statt svn diff aufzurufen und eine Patch-Datei zu versenden (die allerdings weder Änderungen an Verzeichnissen, symbolischen Links oder Eigenschaften beinhaltet), können Sie svn copy verwenden, um Ihre Arbeitskopie in einen privaten Bereich des Projektarchivs „abzulegen“. Ihr Mitarbeiter kann dann entweder eine exakte Kopie Ihrer Arbeitskopie auschecken oder svn merge verwenden, um genau Ihre Änderungen zu empfangen.
Obwohl dies eine nette Methode ist, schnell eine Momentaufnahme Ihrer Arbeitskopie anzulegen, sollten Sie beachten, dass es keine gute Vorgehensweise ist, einen Zweig zu erstellen. Die Erzeugung eines Zweigs sollte ein Ereignis für sich sein, wohingegen diese Methode die Erzeugung eines Zweigs mit zusätzlichen Änderungen an Dateien innerhalb einer einzelnen Revision verbindet. Das macht es später sehr schwer, eine einzelne Revisionsnummer als Verzweigungspunkt zu identifizieren.