web-dev-qa-db-fra.com

Comment créer correctement une étiquette SVN à partir du tronc?

Je crée mon premier projet dans Subversion . Jusqu'ici j'ai

 branches
 tags
 trunk

Je pense que je dois immédiatement faire des branches singulières et recommencer. Update branches est la norme.

J'ai travaillé dans le coffre et déplacé le contenu vers les balises comme suit.

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

Mon instinct me dit que c'est totalement faux et que je devrais maintenir une relation entre les fichiers en utilisant svn copy. Les fichiers que je crée de cette manière n’auront aucune relation les uns avec les autres et je suis certain que je n’aurai pas accès aux fonctionnalités de Subversion. Ai-je raison?

Dois-je utiliser svn copy pour les fichiers individuels?

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"

Dois-je utiliser svn copy sur tout le répertoire?

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

Vous avez raison de dire que ce n'est pas "correct" d'ajouter des fichiers dans le dossier des balises.

Vous avez correctement deviné que copy est l'opération à utiliser; cela permet à Subversion de garder une trace de l'historique de ces fichiers, et aussi (je suppose) de les stocker beaucoup plus efficacement.

D'après mon expérience, il est préférable de faire des copies ("instantanés") de projets entiers, c'est-à-dire de tous les fichiers à partir de l'emplacement de extraction racine. Ainsi, l’instantané peut être autonome, en tant que représentation fidèle de l’état du projet dans son ensemble à un moment donné.

Cette partie du "livre" montre comment la commande est généralement utilisée.

181
unwind

Utilisation:

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

Sténographie:

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

Comme l'a noté @victor hugo, la "bonne" méthode consiste à utiliser svn copy . Il y a cependant une mise en garde. La "balise" créée de cette façon ne sera pas une balise vraie. Il s'agira d'une copie exacte de la révision spécifiée, mais il s'agira d'une révision différente Donc, si votre système de compilation utilise svn révision d’une façon ou d’une autre product à partir d'une balise (le résultat aura la révision de la balise à la place de celle du code d'origine ).

Il semble que de par sa conception, svn ne puisse créer une balise META vraiment appropriée.

13
Alexander Amelkin

Il suffit d'utiliser ceci:

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

(bien sûr, sur une seule ligne.) Vous devez toujours créer une branche du dossier et du contenu du coffre. Il est bien sûr possible de créer des sous-parties du tronc, mais ce ne sera presque jamais une bonne pratique. Vous voulez que la branche se comporte exactement comme le coffre, et pour cela, vous devez créer une branche complète.

Voir un meilleur résumé de l'utilisation de SVN sur mon blog: SVN Essentials , et SVN Essentials 2

12
AgilePro
11
Gromer

@victor hugo et @unwind sont corrects, et la solution de Victor est de loin la plus simple. Cependant, faites attention aux externes dans votre projet SVN. Si vous référencez des bibliothèques externes, la référence de révision externe (qu'il s'agisse d'une balise ou de HEAD ou d'un numéro) restera inchangée lorsque vous baliserez des répertoires contenant des références externes.

Il est possible de créer un script pour gérer cet aspect du balisage. Pour une discussion à ce sujet, consultez cet article SO: Balisage d'une extraction SVN avec externals

7
MOK9

Une autre option pour baliser un référentiel Subversion consiste à ajouter la balise à la propriété svn: log comme ceci:

   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

J'ai récemment commencé à penser que c'était le moyen le plus "correct" de taguer. De cette façon, vous ne créez pas de révisions supplémentaires (comme avec "svn cp") et pouvez toujours extraire facilement toutes les balises en utilisant grep sur la sortie "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;
                  }'

En outre, de cette façon, vous pouvez facilement supprimer tags si vous en avez besoin. Ainsi, les balises deviennent une méta-information complète et je l’aime bien.

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

Tout ce que vous avez à faire est de changer le chemin de l'URL. Cette commande créera un nouveau répertoire "tagDestination". La deuxième ligne vous permettra de connaître les détails complets de l'erreur, le cas échéant. Créez la variable svn env ​​si elle n’a pas été créée. Peut vérifier (Cmd: - set, Powershell: - Get-ChildItem Env:) Le chemin par défaut est "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"

0
Ashu