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

je crée mon premier projet dans Subversion . Jusqu'à présent j'ai

 branches
 tags
 trunk

je pense que j'ai immédiatement besoin de faire des branches au singulier et de recommencer. "1519100920 de mise à Jour" branches est la norme.

j'ai fait du travail dans le coffre et j'ai déplacé le contenu sur les étiquettes 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 je devrais maintenir une certaine relation entre les fichiers utilisant svn copy . Les fichiers que je crée de cette façon n'auront aucune relation les uns avec les autres, et je suis sûr que je manquerai les fonctionnalités de Subversion. Suis-je la corriger?

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 l'ensemble du répertoire?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"
261
svn
demandé sur Peter Mortensen 2009-05-12 10:17:44

8 réponses

vous avez raison en ce qu'il n'est pas" correct " d'ajouter des fichiers dans le dossier tags.

vous avez correctement deviné que copy est l'opération à utiliser; cela permet à Subversion de suivre 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 ("snapshots") de projets entiers, c'est-à-dire de tous les fichiers de l'emplacement de départ. De cette façon, le snapshot peut se tenir tout seul, représentation fidèle de l'état du projet dans son ensemble à un moment précis.

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

179
répondu unwind 2012-01-12 10:08:55

utiliser:

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

Raccourci:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"
404
répondu victor hugo 2018-05-14 17:11:59

comme l'a noté @victor hugo, la manière" correcte " est d'utiliser svn copy. Il y a une mise en garde, cependant. Le "tag" créé de cette façon ne sera pas un vrai tag, il sera une copie exacte de la révision, mais il sera différent révision elle-même. Donc si votre système de compilation utilise svn revision d'une manière ou d'une autre (par exemple, incorpore le nombre obtenu avec "svn info" dans la version de le produit que vous), alors vous ne serez pas en mesure de construire exactement le même produit à partir d'une étiquette (le résultat sera la révision de la balise au lieu de celui de la code d'origine).

il semble que par conception il n'y a aucun moyen dans svn de créer une balise meta vraiment correcte.

12
répondu Alexander Amelkin 2012-06-15 11:03:50
11
répondu Gromer 2009-05-12 06:20:02

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"

(tous sur une ligne, bien sûr.) Vous devez toujours créer une branche du dossier principal et de son contenu. Il est bien sûr possible de raccorder des sous-parties du tronc, mais cela ne sera presque jamais une bonne pratique. Vous voulez que la branche se comporte exactement comme le tronc fait maintenant, et pour que cela arrive, vous devez ramifier le tronc entier.

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

11
répondu AgilePro 2015-10-09 21:58:30

@victor hugo et @unwind sont corrects, et la solution de victor est de loin la plus simple. Cependant, méfiez-vous des externalités dans votre projet SVN. Si vous faites référence à des bibliothèques externes, la référence de révision externe (qu'il s'agisse d'une balise, D'une tête ou d'un numéro) restera inchangée lorsque vous marquez des répertoires qui ont des références externes.

il est possible de créer un script pour gérer cet aspect du tagging, pour une discussion sur ce sujet, voir cet article SO: Le marquage d'un SVN checkout avec des externes

7
répondu MOK9 2017-05-23 12:02:18

une autre option pour marquer un dépôt Subversion est d'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'est la façon la plus" correcte " d'étiqueter. De cette façon, vous ne créez pas de révisions supplémentaires (comme vous le faites 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=;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: ";
                      }
                      expect_tag=0;
                  }'

aussi, de cette façon, vous pouvez seamlessly supprimer tags Si vous avez besoin. Si les tags deviennent une méta-information complète, et je l'aime.

4
répondu Alexander Amelkin 2015-03-11 16:41:33

essayez ceci. Ça marche pour moi:

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"
-3
répondu iboubuntu 2015-11-14 18:09:32