SVN comment résoudre les nouveaux conflits d'arborescence lorsque le fichier est ajouté sur deux branches

95

Lors de la fusion de quelques 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), j'obtiens l'un des nouveaux conflits d'arborescence:

      C foo.txt
  >   local obstruction, incoming add upon merge

J'ai besoin des changements des deux branches, mais le conflit d'arborescence ne me donne pas les fichiers .working, .merge-left et .merge-right habituels - ce qui est compréhensible en raison de la nature du conflit. Il existe un certain nombre de ces conflits, et ceux où une suppression du même fichier a eu lieu 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.

DÉfusion
la source

Réponses:

40

Comme mentionné dans une ancienne version (2009) du document de conception "Tree Conflict" :

Conflit XFAIL de la fusion de l'ajout sur le fichier versionné

Ce test effectue une fusion qui apporte un ajout de fichier sans historique sur un fichier versionné existant .
Il doit s'agir d'un conflit d'arbre sur le fichier de la local obstruction, incoming add upon mergevariété « ». Correction des attentes dans r35341.

(Cela s'appelle aussi "evil twins" dans ClearCase d'ailleurs):
un fichier est créé deux fois (ici "ajouté" deux fois) dans deux branches différentes, créant deux histoires différentes 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 encore sur la branche source, le scénario idéal serait de supprimer ce fichier de la branche source B1, de retour de fusion à partir B2de B1afin de rendre ce fichier visible sur B1(vous serez alors travailler sur le même élément).
Si une fusion n'est pas possible parce que les fusions ne se produisent que de B1à B2, une fusion manuelle sera nécessaire pour chaque B1->B2fusion.

VonC
la source
2
Le document de conception "tree conflict" est lié à la
pourriture
4
Ce qui est amusant, c'est que même si les deux fichiers ajoutés sont identiques, ils apparaissent toujours en conflit. Cela ne devrait vraiment pas être signalé comme un conflit.
SantiBailors du
1
@SantiBailors Tellement drôle que je meurs en ce moment. Dying for my old friend git ...
Winter
163

J'ai trouvé un article suggérant une solution pour cela . Il est sur le point de courir:

svn resolve --accept working <YourPath>

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

lukmdo
la source
2
Merci, cela résout également: C foo.txt> ajout local, ajout entrant lors de la mise à jour
lazysoundsystem
5
merci cela a fonctionné pour moi aussi mais je devais faire ceci: svn resolution --accept working FILENAME
ajacian81
5
ouais vous avez besoin d'un nom de fichier. Il accepte '.' (le répertoire actuel). J'avais également besoin de le faire de manière récursive: "svn resolution --accept working --recursive." résout tout en faveur de votre copie de travail (dangereux! Vous risquez de souffler les changements d'autres personnes lorsque vous faites cela, comme toujours lors de la résolution de conflits)
Harry Wood
J'utilise un alias que j'ai créé pour lister tous les fichiers en conflit d'arborescence: alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' Ensuite, je peux utiliser ceci comme argument de la commande de résolution, comme ceci: svn resolve --accept working $(mtc)
Earl Jenkins
1
En fait, vous devez également spécifier la ressource, par exemple: svn resolve --accept working path/index.html
Tomasz Kuter
9

Et si les modifications entrantes sont celles que vous souhaitez? Je ne parviens pas à exécuter svn resolution - acceptez leur plein

svn resolution --accept base

Gabriel FT Gomes
la source
4
Je pense avoir mal compris la question. «base» est, en effet, équivalent à «leur-plein» lorsque vous utilisez «svn résoudre» mais cela ne résout pas votre problème. Ce que j'ai fait à la place, était de le diviser en deux parties: 1) Supprimer mon répertoire (ou fichier) en conflit local, 2) Fusionner. Cela devrait fonctionner sans conflit, et comme `` les modifications entrantes sont celles que vous voulez '', je ne me soucierais pas des éléments supprimés
Gabriel FT Gomes
3

J'ai juste réussi à me caler en essayant de suivre les conseils de user619330 ci-dessus. La situation était: (1): j'avais ajouté quelques fichiers en travaillant sur ma branche initiale, branch1; (2) J'ai créé une nouvelle branche, branch2 pour un développement ultérieur, en la branchant du tronc puis en fusionnant mes modifications de branch1 (3) Un collègue avait copié mes mods de branch1 dans sa propre branche, ajouté d'autres mods, puis a fusionné avec le coffre; (4) Je voulais maintenant fusionner les dernières modifications de trunk dans ma branche de travail actuelle, branch2. C'est avec svn 1.6.17.

La fusion avait des conflits d'arborescence avec les nouveaux fichiers, et je voulais la nouvelle version du tronc où ils différaient, donc à partir d'une copie propre de branch2, j'ai fait une suppression svn des fichiers en conflit, commis ces changements branch2 (créant ainsi un temporaire version de branch2 sans les fichiers en question), puis a fait ma fusion à partir du tronc. J'ai fait cela parce que je voulais que l'historique corresponde à la version du tronc afin de ne pas avoir plus de problèmes plus tard en essayant de fusionner avec le tronc. La fusion s'est bien déroulée, j'ai obtenu la version du tronc des fichiers, svn st montre que tout va bien, puis j'ai rencontré plus de conflits d'arbres en essayant de valider les modifications, entre la suppression que j'avais faite plus tôt et l'ajout de la fusion. Est-ce que svn a résolu les conflits en faveur de ma copie de travail (qui avait maintenant la version de tronc des fichiers), et l'a fait valider.

Et bien non. Une mise à jour d'une autre copie de branch2 a abouti à l'ancienne version des fichiers (fusion avant le tronc). Alors maintenant, j'ai deux copies de travail différentes de branch2, supposément mises à jour vers la même version, avec deux versions différentes des fichiers, et toutes deux insistant sur le fait qu'elles sont entièrement à jour! L'extraction d'une copie propre de branch2 a abouti à l'ancienne version (pré-trunk) des fichiers. Je les mets à jour manuellement vers la version du tronc et je valide les modifications, je retourne à ma première copie de travail (à partir de laquelle j'avais soumis les modifications du tronc à l'origine), j'essaie de la mettre à jour et j'obtiens maintenant une erreur de somme de contrôle sur les fichiers en question. Soufflez le répertoire en question, obtenez une nouvelle version via la mise à jour, et enfin j'ai ce qui devrait être une bonne version de branch2 avec les changements de tronc. J'espère. Attention développeur.

rosée
la source