tortoise Come creare correttamente un tag SVN dal trunk?




svn tag version (7)

Come notato da @victor hugo, il modo "corretto" è usare la copia di svn. 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 di svn (ad esempio incorpora il numero ottenuto con 'svn info' nella versione del prodotto che hai creato), allora non sarai in grado di costruire esattamente lo stesso prodotto da un tag (il il risultato avrà la revisione del tag anziché quella del codice originale).

Sembra che per impostazione non ci sia modo in svn di creare un vero meta tag.

Sto creando il mio primo progetto in Subversion . Finora ho

 branches
 tags
 trunk

Penso che ho bisogno di creare filiali singolari e ricominciare da capo. I rami di aggiornamento sono la norma.

Ho lavorato sul trunk e ho spostato il contenuto sui 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 qualche relazione tra i file usando la svn copy . I file che creo in questo modo non avranno alcuna relazione tra loro e sono certo che mi mancheranno le funzionalità di Subversion. Ho ragione?

Dovrei usare la copia svn 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 la copia svn sull'intera directory?

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

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

   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

Recentemente ho iniziato a pensare che questo è il modo più "giusto" per taggare. In questo modo non si creano revisioni extra (come si fa con "svn cp") e si può facilmente estrarre tutti i tag usando grep sull'output "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 puoi eliminare i tag senza problemi, se necessario. Quindi i tag diventano una meta-informazione completa e mi piace.


@victor hugo e @unwind sono corretti e la soluzione del vincitore è di gran lunga la più semplice. Tuttavia, ATTENTI agli esterni nel tuo progetto SVN. Se si fa riferimento a librerie esterne, il riferimento di revisione esterno (se 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 tale argomento, vedere questo articolo SO: Tagging di un controllo SVN con esterni



Basta fare

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

Hai ragione nel senso che non è "giusto" aggiungere file alla cartella dei tag.

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

Nella mia esperienza, è meglio fare copie ("istantanee") di interi progetti, cioè tutti i file dalla posizione di estrazione principale. In questo modo l'istantanea può reggersi da sola, come una rappresentazione fedele dell'intero stato del progetto in un determinato momento.

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


Basta usare 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 e dei contenuti. Ovviamente è possibile suddividere sotto-parti del bagagliaio, ma questa non sarà quasi mai una buona pratica. Vuoi che il ramo si comporti esattamente come fa il tronco adesso, e perché ciò avvenga, devi ramificare l'intero tronco.

Vedi un miglior riassunto dell'uso di SVN nel mio blog: SVN Essentials e SVN Essentials 2





tags