Come creare correttamente un tag SVN dal trunk?


282

Sto creando il mio primo progetto in Subversion . Finora l'ho fatto

 branches
 tags
 trunk

Penso di dover immediatamente rendere singolari i rami e ricominciare da capo. L'aggiornamento dei rami è la norma.

Ho lavorato nel bagagliaio e spostato il contenuto nei tag come segue.

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

Il mio istinto mi dice che questo è totalmente sbagliato, e dovrei mantenere una relazione tra i file usando svn copy. I file che creo in questo modo non avranno alcuna relazione reciproca e sono sicuro che mi perderò le funzionalità di Subversion. Ho ragione?

Dovrei usare svn copy per i singoli file?

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"

Dovrei usare svn copy sull'intera directory?

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

10
Sfortunatamente non faccio tutte le scelte in questo caso ... git è una dannata magia.
ojblass,

Risposte:


186

Hai ragione a dire che non è "giusto" aggiungere file alla cartella dei tag.

Hai indovinato correttamente che copyè l'operazione da utilizzare; consente a Subversion di tenere traccia della cronologia di questi file e anche (presumo) di memorizzarli in modo molto più efficiente.

Nella mia esperienza, è meglio fare copie ("istantanee") di interi progetti, vale a dire tutti i file dalla posizione di checkout di root. In questo modo l'istantanea può essere autonoma, come una rappresentazione reale dello stato dell'intero progetto in un determinato momento.

Questa parte del "libro" mostra come viene generalmente utilizzato il comando.


15
La versione 1.1 del libro è terribilmente obsoleta. Ecco un link migliore: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
i file copiati non richiedono spazio extra
Carlos

424

Uso:

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

Abbreviazione:

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

36
Ho contrassegnato questo come risposta. Solo una nota in più. È possibile ottenere una revisione precedente del trunk e anche "tag". il comando: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "Tagging, ma usando una versione precedente (123)."
granadaCoder,

7
Ottengo svn: le operazioni locali e senza commit non accettano un messaggio di registro o le proprietà di revisione , quindi rimuovo solo l'opzione -m.
Jonny

4
Solo una FYI, assicurati che l'URL corrisponda al tuo repository incluso http o https.
Norman H,

2
Perché il \ alla fine della prima riga?
Fractaliste,

1
@Jonny Non riesco a eseguire il comando sopra senza l'opzione "-m". Sto usando il terminale su Mac.
Abdurrahman Mubeen Ali,

14

Come notato da @victor Hugo, il modo "corretto" è usare svn copy. C'è un avvertimento però. Il "tag" creato in questo modo non sarà un vero tag, sarà una copia esatta della revisione specificata, ma sarà una revisione diversa. Quindi, se il tuo sistema di compilazione utilizza in qualche modo la revisione svn (ad es. Incorpora il numero ottenuto con 'svn info' nella versione del prodotto che costruisci), allora non sarai in grado di costruire esattamente lo stesso prodotto da un tag (il risultato avrà la revisione del tag anziché quella del codice originale).

Sembra che in svn non ci sia modo di creare un meta tag veramente corretto.


4
È possibile utilizzare "Last Changed Rev": echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

In questo modo, due rami con (ovviamente) numeri di revisione diversi producono ancora la stessa versione del software.
18446744073709551615

1
Sì, hai ragione su Last Changed Rev, ma questo non cambia il fatto che in Subversion non ci sono tag reali.
Alexander Amelkin,

@ 18446744073709551615: puoi evitare di usare awke ottenere quelle informazioni direttamente da svn usando l' --show-itemopzione:svn info --show-item last-changed-revision
Luchostein,

12

Usa questo:

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

(tutto su una riga, ovviamente.) Dovresti sempre creare un ramo dell'intera cartella trunk e dei contenuti. Naturalmente è possibile ramificare sotto-parti del tronco, ma questa non sarà quasi mai una buona pratica. Volete che il ramo si comporti esattamente come fa il tronco adesso, e affinché ciò accada dovete ramificare l'intero tronco.

Consulta un riepilogo migliore dell'utilizzo di SVN sul mio blog: SVN Essentials e SVN Essentials 2


Puoi spiegare come dovrebbe apparire se controllo solo dal bagagliaio e sono dentro con la mia sceneggiatura.
aholbreich,

Se è stata estratta la cartella trunk, è necessario utilizzare l'indirizzo http del repository. Ho aggiornato la risposta per rappresentarlo poiché il check out della cartella trunk è il modello consigliato.
AgilePro

In che modo questa risposta è diversa da quella accettata?
Daniel W.


7

@victor hugo e @unwind sono corretti e la soluzione di victor è di gran lunga la più semplice. Tuttavia, ATTENZIONE agli esterni nel progetto SVN. Se si fa riferimento a librerie esterne, il riferimento di revisione esterno (sia esso un tag, o HEAD o numero) rimarrà invariato quando si etichettano le directory che hanno riferimenti esterni.

È possibile creare uno script per gestire questo aspetto del tagging, per una discussione su quell'argomento, vedere questo articolo SO: Tagging di un checkout SVN con esterni


5

Un'altra opzione per taggare un repository Subversion è aggiungere il tag alla proprietà svn: log in questo modo:

   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

Di recente ho iniziato a pensare che questo sia il modo più "giusto" per taggare. In questo modo non crei ulteriori revisioni (come fai con "svn cp") e puoi comunque estrarre facilmente tutti i tag usando grep sull'output di "svn log":

   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;
                  }'

Inoltre, in questo modo è possibile eliminare senza problemi i tag, se necessario. Quindi i tag diventano una meta-informazione completa e mi piace.


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

Tutto quello che devi fare cambia il percorso dell'URL. Questo comando creerà la nuova directory "tagDestination". La seconda riga ti comunicherà tutti i dettagli dell'errore, se presenti. Crea una variabile svn env se non creata. Può controllare (Cmd: - set, Powershell: - Get-ChildItem Env :) Il percorso predefinito è "C: \ Programmi \ TortoiseSVN \ bin \ TortoiseProc.exe"


-4

Prova questo. Per me funziona:

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
Questo è sicuramente un modo sbagliato di andare. Il tag (Release1.0) dovrebbe essere una copia della directory di origine (trunk), non una directory creata in modo arbitrario. Se lo fai come hai fatto, perdi la cronologia della directory di origine stessa e mantieni la cronologia dei nodi discendenti (file e directory).
Alexander Amelkin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.