Wie erstelle ich ein SVN-Tag richtig aus dem Trunk?


282

Ich erstelle mein erstes Projekt in Subversion . Soweit habe ich

 branches
 tags
 trunk

Ich denke, ich muss sofort Zweige singulär machen und von vorne anfangen. Zweigstellen aktualisieren ist die Norm.

Ich habe im Kofferraum gearbeitet und den Inhalt wie folgt in Tags verschoben.

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

Mein Bauch sagt mir, dass dies völlig falsch ist, und ich sollte eine Beziehung zwischen den verwendeten Dateien aufrechterhalten svn copy. Die Dateien, die ich auf diese Weise erstelle, haben keine Beziehung zueinander, und ich bin sicher, dass ich die Subversion-Funktionen verpassen werde. Hab ich recht?

Soll ich für die einzelnen Dateien eine SVN-Kopie verwenden?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

Soll ich svn copy für das gesamte Verzeichnis verwenden?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"

10
Leider treffe ich in diesem Fall nicht alle Entscheidungen ... git ist verdammt magisch.
Ojblass

Antworten:


186

Sie haben insofern Recht, als es nicht "richtig" ist, Dateien zum Tags-Ordner hinzuzufügen.

Sie haben richtig geraten, dass dies copydie zu verwendende Operation ist. Damit kann Subversion den Verlauf dieser Dateien verfolgen und sie (ich nehme an) viel effizienter speichern.

Nach meiner Erfahrung ist es am besten, Kopien ("Schnappschüsse") ganzer Projekte zu erstellen, dh aller Dateien vom Stammauscheckort. Auf diese Weise kann der Schnappschuss als eigenständige Darstellung des gesamten Projektstatus zu einem bestimmten Zeitpunkt für sich allein stehen.

Dieser Teil von "Das Buch" zeigt, wie der Befehl normalerweise verwendet wird.


15
Die 1.1-Version des Buches ist schrecklich veraltet. Hier ist ein besserer Link: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
kopierte Dateien verbrauchen keinen zusätzlichen Speicherplatz
Carlos

424

Verwenden:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

Kurzschrift:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"

36
Ich habe dies als Antwort markiert. Nur eine zusätzliche Anmerkung. Sie können eine frühere Version des Trunks erhalten und ihn ebenfalls "markieren". den Befehl: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "Tagging, jedoch mit älterer Revision (123)."
GranadaCoder

7
Ich erhalte svn: Lokale, nicht festgeschriebene Vorgänge akzeptieren keine Protokollnachrichten oder Revisionseigenschaften , daher entferne ich einfach die Option -m.
Jonny

4
Stellen Sie nur zu Ihrer Information sicher, dass Ihre URL mit Ihrem Repository übereinstimmt, einschließlich http oder https.
Norman H

2
Warum das \ am Ende der ersten Zeile?
Fractaliste

1
@Jonny Ich kann den obigen Befehl ohne die Option "-m" nicht ausführen. Ich benutze Terminal auf Mac.
Abdurrahman Mubeen Ali

14

Wie von @victor hugo festgestellt, ist die "richtige" Methode die Verwendung von svn copy. Es gibt jedoch eine Einschränkung. Das auf diese Weise erstellte "Tag" ist kein echtes Tag, sondern eine exakte Kopie der angegebenen Revision, es handelt sich jedoch um eine andere Revision. Wenn Ihr Build-System also irgendwie die svn-Revision verwendet (z. B. die mit 'svn info' erhaltene Nummer in die Version des von Ihnen erstellten Produkts einbezieht), können Sie nicht genau dasselbe Produkt aus einem Tag (dem Das Ergebnis enthält die Überarbeitung des Tags anstelle des ursprünglichen Codes.

Es sieht so aus, als ob es in svn keine Möglichkeit gibt, ein wirklich richtiges Meta-Tag zu erstellen.


4
Es ist möglich, "Last Changed Rev" zu verwenden: echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

Auf diese Weise erzeugen zwei Zweige mit (natürlich) unterschiedlichen Versionsnummern immer noch dieselbe Softwareversion.
18446744073709551615

1
Ja, Sie haben Recht mit Last Changed Rev, aber das ändert nichts an der Tatsache, dass Subversion von Natur aus keine echten Tags enthält.
Alexander Amelkin

@ 18446744073709551615: Sie können die Verwendung vermeiden awk , diese Informationen direkt von svn zu und zu erhalten, indem Sie die --show-itemOption verwenden:svn info --show-item last-changed-revision
Luchostein

12

Verwenden Sie einfach dies:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

(Natürlich alles in einer Zeile.) Sie sollten immer einen Zweig des gesamten Trunk-Ordners und des Inhalts erstellen. Es ist natürlich möglich, Teile des Rumpfes zu verzweigen, aber dies wird fast nie eine gute Praxis sein. Sie möchten, dass sich der Zweig genau so verhält wie der Trunk jetzt, und dazu müssen Sie den gesamten Trunk verzweigen.

Eine bessere Zusammenfassung der SVN-Nutzung finden Sie in meinem Blog: SVN Essentials und SVN Essentials 2


Können Sie näher erläutern, wie es aussehen soll, wenn ich nur aus dem Kofferraum checkoput und mit meinem Skript drinnen bin?
Aholbreich

Wenn Sie den Trunk-Ordner ausgecheckt haben, müssen Sie die http-Adresse des Repositorys verwenden. Ich habe die Antwort aktualisiert, um dies darzustellen, da das Auschecken des Trunk-Ordners das empfohlene Muster ist.
AgilePro

Wie unterscheidet sich diese Antwort von der akzeptierten?
Daniel W.


7

@ Victor Hugo und @ Unwind sind korrekt, und die Lösung von Victor ist bei weitem die einfachste. Achten Sie jedoch auf externe Elemente in Ihrem SVN-Projekt. Wenn Sie auf externe Bibliotheken verweisen, bleibt die Revisionsreferenz der externen Bibliothek (ob Tag, HEAD oder Nummer) unverändert, wenn Sie Verzeichnisse mit externen Referenzen kennzeichnen.

Es ist möglich, ein Skript zu erstellen, das diesen Aspekt des Tagging behandelt. Eine Diskussion zu diesem Thema finden Sie in diesem SO-Artikel: Taggen eines SVN-Checkout mit externen Elementen


5

Eine weitere Option zum Markieren eines Subversion-Repositorys besteht darin, das Tag der Eigenschaft svn: log wie folgt hinzuzufügen:

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

Ich habe kürzlich angefangen zu denken, dass dies der "richtige" Weg ist, um zu markieren. Auf diese Weise erstellen Sie keine zusätzlichen Revisionen (wie bei "svn cp") und können trotzdem alle Tags einfach extrahieren, indem Sie grep für die Ausgabe von "svn log" verwenden:

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

Auf diese Weise können Sie Tags bei Bedarf nahtlos löschen . So werden die Tags zu einer vollständigen Meta-Information, und ich mag es.


0
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

Alles was Sie tun müssen, um den URL-Pfad zu ändern. Dieser Befehl erstellt das neue Verzeichnis "tagDestination". In der zweiten Zeile werden Sie gegebenenfalls über die vollständigen Fehlerdetails informiert. Erstellen Sie die Variable svn env, wenn sie nicht erstellt wurde. Kann überprüfen (Cmd: - set, Powershell: - Get-ChildItem Env :) Der Standardpfad lautet "C: \ Programme \ TortoiseSVN \ bin \ TortoiseProc.exe".


-4

Versuche dies. Für mich geht das:

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"

1
Dies ist definitiv ein falscher Weg. Das Tag (Release 1.0) sollte eine Kopie des Quellverzeichnisses (Trunk) sein, kein willkürlich erstelltes Verzeichnis. Wenn Sie es so machen, wie Sie es getan haben, verlieren Sie den Verlauf des Quellverzeichnisses selbst und behalten nur den Verlauf der untergeordneten Knoten (Dateien und Verzeichnisse) bei.
Alexander Amelkin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.