3 votes

Comment peut-on faire une branche rétroactive dans subversion, ou comment peut-on enregistrer un retour en arrière d'un patch fusionné ?

Une partie du développement que j'ai fait sur un projet ne peut pas être déployé, et aurait dû être fait dans une branche séparée. J'ai fusionné les changements en arrière (via "revert changes from this revision" de tortoise et une édition minutieuse), annulant le travail qui aurait dû être fait dans une branche séparée, et j'ai commis ce patch inverse au tronc. Je voudrais maintenant créer une branche qui inclut les changements qui ont été annulés dans le patch mentionné ci-dessus. Voici ce que j'ai fait :

J'ai créé une nouvelle branche pour le nouveau développement à la révision précédant la révision d'annulation.

J'ai fusionné la révision d'annulation dans la nouvelle branche via la fonction "merge a range of revisions" dans le SVN de tortoise.

J'ai ouvert le journal des modifications, sélectionné "Inclure les révisions fusionnées", et "rétablir les modifications de cette révision". Cela a inversé ces changements dans ma copie de travail. C'est maintenant ce que je voudrais que la branche soit. J'ai validé ces changements. Ce commit liste le patch d'annulation sous " include merged revisions " ; je ne pense pas qu'il devrait le faire ; il semble y avoir un problème ici. La clé est probablement d'enregistrer ce patch (l'inverse au carré, ou le produit des modifications originales) d'une manière telle que subversion ignore l'opération effectuée pour le créer.

J'ai ensuite fusionné toutes les modifications du tronc dans la nouvelle branche via la même méthode (fusion d'une série de révisions). J'ai inclus une seconde fois le correctif d'annulation original, rendant ma branche identique à trunk (en le listant maintenant trois fois comme une révision fusionnée incluse). Ce n'est pas le résultat souhaité.

<Edit - Solution>

Ce qui suit est le comportement souhaité, et fonctionne correctement :

J'ai d'abord créé un dépôt vide avec les dossiers tags, trunk, branch. Dans trunk j'ai créé un fichier file.txt avec le contenu (rev1) :

one
two
three

Ensuite, modifiez le fichier pour

one
two_edit
three

Et enregistré (rev2). Ensuite, j'ai sélectionné la révision 2 dans le journal et j'ai choisi de rétablir les changements de cette révision et j'ai archivé la révision 3. Le fichier ressemble à nouveau à ceci :

one
two
three

J'ai ensuite créé une branche de trunk à partir de rev3 aux branches \b1 (rev4, was5 ; cette étape fait les deux). Dans les branches \b1 le fichier ressemble à ceci :

one
two
three

Je fais ensuite une reverse merge de la rev2 du trunk vers branches/b1 en ignorant ancestry (rev5). La branche ressemble maintenant à ceci, et c'est maintenant une pure coïncidence que l'historique contienne quelque chose de similaire :

one
two_edit
three

Je modifie le tronc (rev6) pour qu'il ressemble à ce qui suit :

one
two
three
four

Je fusionne todos changements du tronc dans branches/b1 (rev7). branches/b1 ressemble maintenant correctement à :

one
two_edit
three
four

</p> <p>Edit - Solution>

<Edit>

Comment cela devrait fonctionner

Ce qui suit est le comportement souhaité, et fonctionne correctement si l'étape en italique est effectuée comme suit :

J'ai d'abord créé un dépôt vide avec des dossiers tags, trunk, branch. Dans trunk j'ai créé un fichier file.txt avec le contenu (rev1) :

one
two
three

Ensuite, modifiez le fichier pour

one
two_edit
three

Et enregistré (rev2). Ensuite, j'ai sélectionné la révision 2 dans le journal et j'ai choisi de rétablir les modifications de cette révision et j'ai archivé la révision 3. Le fichier ressemble à nouveau à ceci :

one
two
three

J'ai ensuite créé une branche du trunk de rev2 aux branches \b1 (rev4). Dans les branches \b1 le fichier ressemble à ceci :

one
two_edit
three

Je fusionne ensuite la révision 3 du tronc dans les branches. \b1 (rev5), la branche ressemble maintenant à ceci :

one
two
three

J'édite la branche 3 (rev6) comme si j'étais en train de bifurquer à ce stade. C'est maintenant une pure coïncidence que l'historique contienne quelque chose de similaire :

one
two_edit
three

Je modifie le tronc (rev7) pour qu'il ressemble à ce qui suit :

one
two
three
four

Je fusionne todos les changements du tronc dans branches/b1 (rev8). branches/b1 ressemble maintenant à :

one
two_edit
three
four

Comment cela fonctionne-t-il ?

Voici le comportement réel ; il ne fonctionne pas correctement si l'étape en italique est exécutée, ce qui est nécessaire en raison de la complexité de la branche rétroactive. L'erreur se trouve dans la deuxième ligne de l'étape finale.

J'ai d'abord créé un dépôt vide avec des dossiers tags, trunk, branch. Dans trunk j'ai créé un fichier file.txt avec le contenu (rev1) :

one
two
three

Ensuite, modifiez le fichier pour

one
two_edit
three

Et enregistré (rev2). Ensuite, j'ai sélectionné la révision 2 dans le journal et j'ai choisi de rétablir les modifications de cette révision et j'ai archivé la révision 3. Le fichier ressemble à nouveau à ceci :

one
two
three

J'ai ensuite créé une branche du trunk de rev2 aux branches \b1 (rev4). Dans les branches \b1 le fichier ressemble à ceci :

one
two_edit
three

Je fusionne ensuite la révision 3 du tronc dans les branches. \b1 (rev5), la branche ressemble maintenant à ceci :

one
two
three

Dans les branches \b1 J'ai sélectionné la révision 5 dans le journal et j'ai choisi de rétablir les changements de cette révision et de les enregistrer (révision 6). Le fichier ressemble à nouveau à ceci :

one
two_edit
three

Je modifie le tronc (rev7) pour qu'il ressemble à ce qui suit :

one
two
three
four

Je fusionne todos les changements du tronc dans branches/b1 (rev8). branches/b1 ressemble maintenant à :

one
two
three
four

</em>

6voto

Christoph Strasen Points 1928

Le problème que vous avez décrit (et votre solution) est assez courant. Bien sûr, il aurait été plus judicieux de commencer le développement des modifications "à ne pas mettre en ligne" dans une branche séparée, mais je sais que nous ne vivons pas dans un monde parfait et que les choses changent ;).

Heureusement, avec un bon système de contrôle de version tel que SVN, vous pouvez apporter n'importe quel changement à n'importe quel moment et à n'importe quel endroit. Et il existe de multiples façons de le faire. Ainsi, alors que vous avez déjà répondu à votre question par vous-même, j'ai pris la liberté de rédiger comment je comprends votre problème et comment je l'aurais résolu. Le tableau ci-dessous servira également à des fins internes, donc aucun mal ne sera fait s'il ne vous aide pas davantage.

D'ailleurs, je ne suis pas très familier avec tortoise mais je suppose que cela rend le cherrypicking (le cherrypicking inverse dans votre cas) plus facile que la ligne de commande SVN. Surtout si vous avez beaucoup de commits dispersés à sélectionner. Je préfère toujours la CLI pour les opérations de fusion car elle permet souvent de mieux comprendre ce que je suis en train de faire ;)

Je te souhaite des fusions sans conflit mon ami ;)

Christoph

repository time chart

1voto

Albin Sunnanbo Points 30722

Dans la boîte de dialogue de la branche de TortoiseSVN, choisissez "Révision spécifique dans le référentiel", utilisez l'icône ... pour choisir la dernière révision que vous voulez avoir dans votre nouvelle branche.

Procédez comme d'habitude lors de l'embranchement.

<Edit>

J'ai essayé de reproduire votre problème, il est assez difficile de suivre ce qui est dans le tronc et ce qui est dans la branche, mais voici comment j'ai fait.

J'ai d'abord créé un référentiel vide avec des dossiers tags , trunk , branch . Sur trunk J'ai créé un fichier file.txt avec le contenu (rev1) :

one
two
three

Puis j'ai modifié le fichier pour

one
two_edit
three

et enregistré (rev2). J'ai ensuite sélectionné rev2 dans le journal et choisi revert changes from this revision et enregistré (rev3). Le fichier ressemble maintenant à nouveau à ceci :

one
two
three

J'ai ensuite créé une branche de trunk de rev2 à branches\b1 (rev4). Sur le site branches\b1 le fichier ressemble à ceci :

one
two_edit
three

Puis j'édite le fichier comme ceci dans trunk et s'enregistrer (rev5)

one
two
three
four

Ensuite, je fusionne de trunk à branches\b1 cueillette uniquement rev5 et commettre (rev6). Maintenant branches\b1\file.txt ressemble à ceci

one
two_edit
three
four

Tout est fusionné comme je le pensais.

À quel moment de ce processus cela se passe-t-il "mal" pour vous ?

</em>

1voto

Bert F Points 27237

La clé est probablement d'enregistrer ce patch (l'inverse au carré, ou le produit des modifications originales) d'une manière telle que la subversion ignore l'opération effectuée pour le créer.

Je pense que vous parlez d'essayer de bloquer le suivi des fusions, c'est-à-dire le mergeinfo, pour qu'il ne soit pas enregistré dans la branche. Je pense que vous pouvez le faire en utilisant svn diff o svn merge --ignore-ancestry . Lisez le livre rouge SVN sur Fusion avancée et plus particulièrement Fusions sans mergeinfo y Remarquer ou ignorer l'ascendance .

Plutôt que de créer une branche à partir de la révision 2, il pourrait être plus facile de créer une branche à partir du tronc de la révision 3, puis d'appliquer/capturer les changements de la révision 1 à la révision 2 dans la branche de la révision 3 en utilisant svn diff o svn merge --ignore-ancestry .

Vous pouvez également consulter svn merge --record-only pour simuler une fusion afin de bloquer une révision pour les fusions futures c'est-à-dire convaincre la branche ou le tronc que vous avez déjà fusionné la modification à annuler afin qu'elle ne soit pas appliquée à nouveau.

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