web-dev-qa-db-fra.com

svn: remplacer le tronc par une branche

Quel est le meilleur moyen de transformer le nouveau coffre en l’une des branches d’un référentiel Subversion?

Il y a eu une réécriture majeure pour l’ensemble du système: les choses ont été déplacées, réécrites, remplacées, supprimées, renommées, etc. Le code réécrit a été testé et est prêt à remplacer l’ancienne jonction.

Fondamentalement, l’ancienne ligne principale (Trunk 5) est étiquetée et se termine ici. La branche réécrite (branche 6) doit devenir la nouvelle ligne principale (ligne principale 7):

 Coffre (1) -> Coffre (2) -> Coffre (5) -> × + -> nouveau Coffre (7) 
\\ | 
 Fork fusion ??? 
\\ | 
 + -> Branche (3) -> Branche (4) -> Branche (6) - + 

Tous les changements en cours de l'ancien "Trunk" sont déjà intégrés dans la "branche réécrite"

Comment puis-je faire cela?

151
Jacco

Utilisez svn move pour déplacer le contenu de l'ancienne malle ailleurs et renommer ensuite la branche en malle.

Notez que copier et déplacer dans svn fonctionnent comme des opérations sur les fichiers. Vous pouvez les utiliser pour déplacer/copier des éléments dans votre référentiel. Ces modifications sont également versionnées. Pensez à "déplacer" en tant que "copier + supprimer".

[EDIT] Nilbus vient de me prévenir que vous obtiendrez des conflits de fusion lorsque vous utiliserez svn move.

Je pense toujours que c'est la bonne approche. Cela provoquera des conflits, mais si vous fusionnez avec précaution, il est probable que vous ne perdrez aucune donnée. Si cela vous dérange, utilisez un meilleur VCS comme Mercurial ou Git .

117
Aaron Digulla

Je suis d'accord avec l'utilisation de la commande svn move pour atteindre cet objectif.

Je sais que d’autres ici pensent que c’est inhabituel, mais j’aime bien le faire de cette façon. Lorsque j'ai une branche de fonctionnalité et que je suis prêt à la fusionner avec une ligne de réseau qui a également été modifiée de manière significative, je vais la fusionner avec une nouvelle branche, généralement nommée <FeatureBranchName>-Merged. Ensuite, je résous les conflits et teste le code fusionné. Une fois cette opération terminée, je déplace le coffre dans le dossier des étiquettes afin de ne rien perdre. Enfin je déplace mon <FeatureBranchName>-Merged au coffre.

De plus, je préfère éviter la copie de travail lors des déplacements, voici quelques exemples de commandes:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Note: J'utilise 1.5

65
Ryan Cook

Je ne faisais que regarder ce problème récemment et la solution qui me satisfaisait très bien

svn merge --ignore-ascestry trunk-url branch-url

sur la copie de travail de mon coffre.

Cela n'essaie pas d'appliquer les modifications de manière historique (maintien des modifications dans le coffre). Il "applique simplement le diff" entre le tronc et la branche. Cela ne créera pas de conflits pour vos utilisateurs dans les fichiers non modifiés. Cependant, vous perdrez vos informations historiques de la branche, mais cela se produit quand même si vous effectuez une fusion.

12
user349819

Vous recommandons d'effectuer ces modifications via le navigateur de référentiel.

Tenter des opérations de suppression et de déplacement volumineuses via la copie de travail est un excellent moyen de supprimer la copie de travail. Si vous êtes obligé d'utiliser la copie de travail, effectuez des validations incrémentielles après chaque opération de suppression ou de déplacement, puis MISE À JOUR de votre copie de travail après chaque validation.

8
Chris Nava

Si vous voulez que la branche soit la nouvelle jonction (c'est-à-dire) supprime toutes les modifications apportées à la jonction depuis la création de la branche, vous pouvez: 1. Créer une branche de la jonction (à des fins de sauvegarde) 2. "annuler les modifications "sur le coffre (sélectionnez toutes les révisions après la création de la branche. 3. Fusionner la branche en arrière.

L'histoire devrait rester comme ça.

Cordialement, Roger

3
rboerdijk

Les solutions @Aaron Digulla et @kementeus sont réalisables. Pour les référentiels Subversion 1.4, les opérations de copie/déplacement peuvent rendre difficile la migration future vers une structure de référentiel différente ou le fractionnement des référentiels.

Je pense que les améliorations apportées par la version 1.5 incluent une meilleure résolution de l'historique des déplacements/copies, de sorte que cela ne poserait probablement pas de problème pour un référentiel 1.5.

Pour un référentiel 1.4, je vous recommande d'utiliser svnadmin dump et svndumpfilter effectuer le déplacement du tronc existant ailleurs, puis déplacer la branche vers le tronc avec le même mécanisme. Chargez les deux fichiers de vidage dans un référentiel de test, vérifiez, puis déplacez-le en production.

Bien sûr, sauvegardez votre référentiel existant avant de commencer.

Cela préserve l’historique sans enregistrer explicitement le déplacement/la copie et facilite la réorganisation future, la préservation de l’historique.


Edit: Comme demandé, la documentation du comportement de la version 1.4, tirée du livre 1.4 Red-Bean, Filtrage de l'historique du référentiel

En outre, les chemins copiés peuvent vous causer des problèmes. Subversion prend en charge les opérations de copie dans le référentiel, où un nouveau chemin est créé en copiant un chemin déjà existant. Il est possible qu'à un moment de la vie de votre référentiel, vous ayez copié un fichier ou un répertoire d'un emplacement exclu par svndumpfilter vers un emplacement inclus. Afin de rendre les données de vidage autonomes, svndumpfilter doit toujours afficher l'ajout du nouveau chemin, y compris le contenu des fichiers créés par la copie, et ne pas représenter cet ajout sous forme de copie à partir d'une source. cela n'existera pas dans votre flux de données de vidage filtré. Mais comme le format de vidage du référentiel Subversion affiche uniquement les modifications apportées dans chaque révision, il est possible que le contenu de la source de la copie ne soit pas facilement disponible. Si vous pensez que vous avez des copies de ce type dans votre référentiel, vous voudrez peut-être repenser votre ensemble de chemins inclus/exclus, y compris peut-être les chemins qui ont servi de sources à vos opérations de copie problématiques.

Ceci s’applique aux migrations/réorganisations utilisant svndumpfilter. Il arrive parfois qu'un peu de travail supplémentaire maintenant économise beaucoup de travail supplémentaire plus tard, et en maintenant une utilisation facile de svndumpfilter pour de futures migrations/réorganisations, atténue le risque à un coût relativement bas.

3
Ken Gentle

Bien que les réponses ci-dessus fonctionnent, elles ne sont pas les meilleures pratiques. La dernière piste serveur et client svn fusionne pour vous. Donc, svn sait quelles révisions vous avez fusionné dans une branche et d'où. Cela aide beaucoup lors de la mise à jour d'une branche puis de sa fusion dans le coffre.

Quelle que soit la version de Subversion que vous utilisez, il existe cependant une méthode recommandée pour transférer les modifications d’une branche dans le coffre. Il est décrit dans le manuel Subversion: Contrôle de version avec Subversion, Chapitre 4. Branchement et fusion, Maintien du branchement synchronisé .

2
chopp3r