54 votes

SVN - impossible de fusionner une branche avec le tronc - nombreux conflits d'arbres

J'ai ce que je pensais être un scénario simple - utilisant TortoiseSVN :

1) J'ai créé une branche (B2) d'une application (pour travailler sur l'implémentation de sprites d'images et de JAWR).

2) Les tests et le développement se sont poursuivis normalement sur le tronc.

3) J'ai refait la base de la branche plusieurs fois au cours des derniers jours par :

3.1) Fusionné le tronc (par plage de révisions) à ma copie de travail branch-b2, en résolvant les conflits durant la fusion.

3.2) (après avoir testé la branche-b2), je commite la branche-b2 re-basée.

Tout cela a fonctionné comme prévu. Mais la fusion de la branche vers le tronc me pose problème :

4) Après toutes les mises à jour effectuées dans la branche-b2, je m'assure de faire une mise à jour SVN sur le tronc et la branche-b2.

5) Ensuite, j'essaie de fusionner (gamme de révisions) de la branche-b2 dans le tronc. Cependant, pour tout nouveau fichier qui a été ajouté au tronc, et ensuite ajouté à la branche-b2 lorsque je l'ai rebasé, j'obtiens un conflit d'arbre. Je ne suis pas sûr de la manière appropriée de résoudre ces conflits.

Le conseil le plus courant que j'ai vu est soit de supprimer les fichiers en conflit avec l'arbre du tronc, puis de fusionner la branche avec le tronc ; soit de supprimer l'ensemble du tronc, de copier les fichiers de la branche avec le tronc, puis de les livrer en tant que nouvelle version dans le tronc. Aucune de ces options ne semble être une bonne idée - la première est pénible, et les deux semblent perdre l'historique des révisions des fichiers.

Qu'est-ce que j'ai fait de mal, et comment je peux le réparer ?

73voto

Rytmis Points 15848

On dirait que vous utilisez le style de fusion pré-1.5 et que vous essayez de réintégrer la branche dans le tronc. Dans ce cas, ce que vous voulez faire est d'abord de vous assurer que toutes les modifications du tronc ont été fusionnées dans la branche, puis au lieu de fusionner la branche vers une copie de travail qui pointe vers le tronc, vous voulez fusionner "FROM trunk@HEAD TO branch@HEAD" avec la copie de travail qui pointe vers le tronc. En résumé :

"Donnez-moi tous les changements dont j'aurais besoin pour que le tronc soit identique à la branche".

Cela fonctionne si vous avez déjà fusionné toutes les modifications du tronc vers la branche, car alors la seule différence entre le tronc et la branche sont les modifications apportées dans la branche.

Vous comprenez ? :)

0 votes

Par curiosité et par souci d'équilibre, quel est le style de fusion post-1.5 ?

2 votes

À partir de la version 1.5, vous pouvez sauter l'intervalle de révision dans la première fusion et utiliser quelque chose comme "svn merge --reintegrate branch" pour la seconde fusion (je ne me souviens pas des spécificités du gui TSVN). L'inconvénient est qu'après avoir réintégré la branche, vous devrez la rebrancher parce que la réintégration fait quelque chose de bizarre au mergeinfo.

53 votes

Merci @Rytmis, je viens juste de réussir à le faire, mais je veux proposer une traduction pour les utilisateurs de Tortoise. 1) Basculez votre copie de travail vers la branche (si ce n'est pas déjà fait) 2) Cliquez avec le bouton droit de la souris sur la copie de travail, TortoiseSVN > Fusionner > "Fusionner une gamme de révisions", cliquez sur Suivant 3) URL à fusionner à partir de = Trunk, cliquez sur Suivant, Fusionner 4) Basculer la copie de travail vers Trunk 5) Clic droit sur la copie de travail, TortoiseSVN > Fusionner > "Fusionner deux arbres différents", cliquez sur Suivant 6) De : Trunk (utiliser la révision HEAD) To : Branch (utiliser la révision HEAD) 7) Cliquez sur Suivant, Fusionner. 8) Livrez votre copie de travail. FAIT

3voto

user185717 Points 21

J'ai étudié le même problème. C'est une "fonctionnalité" dans Tortoise SVN 1.6.5. TortoiseSVN 1.5 fonctionne bien avec notre dépôt (SVN 1.5). TortoiseSVN 1.6.5 lors du rebasage ajoute les fichiers de la ligne principale comme NEW (sans sauvegarder l'historique des fusions).
Et la réintégration de la branche a pour conséquence de traiter ces fichiers comme étant en conflit avec la version principale.

J'ai résolu le problème en utilisant la fonctionnalité de TortoiseSVN 1.6 "réintégrer la branche". Elle est spécifiquement destinée aux branches de fonctionnalités.

-- Alexey Korsun

0 votes

Merci. Parmi toutes les discussions sur SO concernant ce problème de "conflit d'arbres", celle-ci m'a aidé à le résoudre correctement.

2voto

Jesse Points 113

Voici un peu plus d'informations pour contribuer à la réponse de @Rytmis qui m'aide à y voir plus clair.

Étapes de haut niveau pour rendre le tronc exactement comme une branche ou un tag :

  1. Sortie du coffre.
  2. En utilisant la copie de travail du tronc, fusionner du tronc à la branche/tag.
  3. Engagez-vous.

Exemple de commandes de ligne de commande 'svn' :

svn checkout <trunk url>
cd trunk
svn merge <trunk url> <branch/tag url>
svn commit -m "<message>"

1voto

Dev Points 11

Sélectionnez les révisions à fusionner en choisissant l'option "Fusionner une gamme de rivisions" en utilisant TortoiseSVN. Cela empêchera les conflits d'arborescence pour les mêmes fichiers de se reproduire à chaque opération de fusion.

1voto

Je n'ai pas vraiment réussi à comprendre comment la solution ci-dessus devait fonctionner, aussi ma méthode de travail est différente. D'abord, je me suis assuré que la branche contenait toutes les modifications du tronc.

1)J'ai une nouvelle copie du coffre. 2)J'ai exporté la branche vers un emplacement temporaire en utilisant la tortoise svn export. 3)J'ai utilisé l'explorateur Windows pour copier l'arborescence entière de la branche vers le tronc et écraser tous les fichiers 4)J'ai utilisé la commande check for changes sur tortoise et inclus la case à cocher all unrevisioned files. 5)J'ai sélectionné tous les fichiers et cliqué sur ajouter.

Vous devriez utiliser des solutions qui n'ont pas été construites afin que les fichiers non révisés n'incluent pas la sortie.

J'ai hâte que nous passions à la version 1.5+.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X