95 votes

SVN comment résoudre de nouveaux conflits d'arborescence lorsqu'un fichier est ajouté sur deux branches

Lors de la fusion de plusieurs branches (en utilisant SVN 1.6.1) où un fichier a été ajouté sur les deux branches (puis travaillé dans ces branches séparées), je rencontre l'un des nouveaux conflits d'arborescence :

      C foo.txt
  >   obstruction locale, ajout entrant lors de la fusion

J'ai besoin des modifications des deux branches, mais le conflit d'arborescence ne me donne pas les fichiers habituels .working, .merge-left et .merge-right -- ce qui est compréhensible en raison de la nature du conflit. Il y a un certain nombre de ces conflits, et ceux où une suppression du même fichier s'est produite sur chaque branche, mais ils sont simples à résoudre.

Comment puis-je résoudre ce problème ? Le livre SVN redbean (pour 1.6) ne couvre pas cette situation.

160voto

lukmdo Points 3511

J'ai trouvé un article suggérant une solution à ce problème. Il s'agit d'exécuter :

svn resolve --accept working 

ce qui marquera les fichiers de la version locale comme OK.
Vous pouvez l'exécuter pour un seul fichier ou pour des catalogues de projets entiers.

40voto

VonC Points 414372

Comme mentionné dans une version antérieure (2009) du document de conception des "conflits d'arborescence":

Conflit XFAIL provenant de la fusion d'un ajout sur un fichier versionné

Ce test effectue une fusion qui apporte un ajout de fichier sans historique sur un fichier versionné existant.
Cela devrait être un conflit d'arborescence sur le fichier de type 'obstruction locale, ajout entrant lors de la fusion'. Attentes corrigées dans r35341.

(C'est aussi appelé "jumeaux maléfiques" dans ClearCase au fait) :
un fichier est créé deux fois (ici "ajouté" deux fois) dans deux branches différentes, créant deux historiques différents pour deux éléments différents, mais avec le même nom.

La solution théorique est de fusionner manuellement ces fichiers (avec un outil de comparaison externe) dans la branche de destination 'B2'.

Si vous travaillez toujours sur la branche source, le scénario idéal serait de supprimer ce fichier de la branche source B1, fusionner ensuite de B2 vers B1 afin de rendre ce fichier visible sur B1 (vous travaillerez ainsi sur le même élément).
Si une fusion de retour n'est pas possible car les fusions se font uniquement de B1 vers B2, alors une fusion manuelle sera nécessaire pour chaque fusion B1->B2.

9voto

Gabriel Points 81

Et si les modifications entrantes sont celles que vous voulez ? Je ne peux pas exécuter svn resolve --accept theirs-full

svn resolve --accept base

2voto

dewtell Points 721

Je viens de réussir à me coincer assez sérieusement en essayant de suivre les conseils de l'utilisateur619330 ci-dessus. La situation était la suivante: (1): j'avais ajouté des fichiers tout en travaillant sur ma branche initiale, branche1; (2) j'ai créé une nouvelle branche, branche2 pour un développement ultérieur, la branchant à partir du tronc et ensuite en fusionnant mes changements de la branche1 (3) Un collègue avait copié mes modifications de la branche1 vers sa propre branche, ajouté d'autres modifications, puis fusionné de nouveau vers le tronc; (4) je voulais maintenant fusionner les derniers changements du tronc dans ma branche de travail actuelle, branche2. Cela se fait avec svn 1.6.17.

La fusion avait des conflits d'arborescence avec les nouveaux fichiers, et je voulais la nouvelle version du tronc là où ils différaient, donc à partir d'une copie propre de branch2, j'ai fait un svn delete des fichiers en conflit, commité ces changements de branch2 (créant ainsi une version temporaire de branch2 sans les fichiers en question), puis j'ai fait ma fusion à partir du tronc. J'ai fait cela parce que je voulais que l'historique corresponde à la version du tronc pour éviter d'avoir plus de problèmes plus tard lors de la fusion de retour vers le tronc. La fusion s'est bien passée, j'ai eu la version du tronc des fichiers, svn st montre tout ok, puis j'ai rencontré plus de conflits d'arborescence en essayant de commettre les changements, entre la suppression que j'avais faite plus tôt et l'ajout de la fusion. J'ai fait un svn resolve des conflits en faveur de ma copie de travail (qui avait maintenant la version du tronc des fichiers), et j'ai pu commettre. Tout devrait être bon, non?

Eh bien, non. Une mise à jour d'une autre copie de branch2 a donné l'ancienne version des fichiers (avant la fusion du tronc). Donc maintenant j'ai deux copies de travail différentes de branch2, censées être mises à jour à la même version, avec deux versions différentes des fichiers, et les deux insistants pour dire qu'elles sont entièrement à jour! Vérifier une copie propre de branch2 a donné la vieille (avant-tronc) version des fichiers. Je mets à jour manuellement ceux-ci vers la version du tronc et commet les changements, reviens à ma première copie de travail (de laquelle j'avais soumis les changements du tronc à l'origine), essaie de la mettre à jour, et obtiens maintenant une erreur de somme de contrôle sur les fichiers en question. Supprime le répertoire en question, obtiens une nouvelle version via update, et enfin j'ai ce qui devrait être une bonne version de branch2 avec les changements du tronc. J'espère. Attention au développeur.

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