Comment mettre à jour correctement une branche de fonction du coffre?

StackOverflow https://stackoverflow.com/questions/2146426

  •  23-09-2019
  •  | 
  •  

Question

livre SVN dit :

...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy

Je trouve cette approche très peu pratique dans les grands développements, pour plusieurs raisons, principalement liées à l'étape de la réintégration.

  1. A partir de SVN v1.5, la fusion se fait rev par rev. Picorage les zones à fusionner nous causerait de résoudre les conflits branche du tronc deux fois (lors de la fusion d'une révision du tronc du FB, et une fois de plus lors de la fusion de retour).
  2. Taille du référentiel:. Modifications du tronc pourraient être importants pour une grande base de code, et la copie des fichiers de différences (contrairement à la copie SVN) de tronc peut d'ailleurs être une surcharge significative

, nous faisons lieu ce que nous appelons « re-branchement ». Dans ce cas, lorsqu'une partie importante des modifications du tronc est nécessaire, une nouvelle branche de fonction est ouvert à partir du tronc en cours, et la fusion est toujours vers le bas (les branches fonctionnelles -> -> trunk branches stables). Cela ne va pas le long des lignes directrices du livre SVN et les développeurs voient comme une douleur supplémentaire.

Comment gérez-vous cette situation?

Était-ce utile?

La solution 2

Après la recherche:

Après de nombreuses séances de remue-méninges à VisionMap, discussions F2F y compris Artyom, l'ouverture d'un cas de livre SVN, etc - il semble que ce n'est pas possible de le faire. Une branche de fonction est tout à fait pas comme copie de travail. La seule façon de mettre à jour de travail est une nouvelle branche recréent, comme décrit ci-dessus.

Autres conseils

  

De SVN v1.5, la fusion se fait rev par rev. Picorage les zones à fusionner nous causerait de résoudre les conflits branche du tronc deux fois (un lors de la fusion des révisions du tronc du FB, et une fois de plus lors de la fusion de retour)

Ensuite, vous faites quelque chose de mal!

Voyons voir:

trunk    fb
 ---------\
 r1-10    |
 r11-20   |
 r20-30   |

En général, si vous voulez les changements effectués dans 11-20, puis les meilleures pratiques consiste à fusionner 1-20 à fb et obtenir tout ce qu'il ya.

Alors quand fb est fait, la fusion 20-30 puis Copier fb le tronc (pas de fusion!).

Si vous décidez de ne fusionner que r11: 20, ok, à la fin, vous aurez besoin de fusionner r1: 10 et r20: 30 puis sur Copier fb tronc.

Il n'y a aucun moyen de fusionner les modifications deux fois!

Je suppose que vous faites probablement suivant:

copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG

Vous ne pouvez pas faire cela parce que vous fusionneriez 11h20 deux fois. Vous devez toujours fusionner code une seule direction.

Manière correcte:

copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk

Modifier

Ainsi, les étapes correctes sont:

  1. Créer branche de fonction (FB) à partir du tronc (tronc de copie en vedette branche avec svn-copie)

    FB_0=trunk_0
    
  2. Les travaux sur FB.

    FB_1=FB_0 + change_a
    
  3. Fusionner toutes les modifications à venir de tronc à FB.

    trunk_1=trunk_0 + tr_change_a;
    FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
    
  4. Les travaux sur FB

    FB_3 = FB_2 + change_b
    
  5. Fusionner tous à venir changements unmerged de coffre à FB.

    trunk_2=trunk_1 + tr_change_n;
    FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    
  6. À ce stade, nous avons une branche de fonction qui consiste à toutes les nouvelles fonctionnalités et tous changements dans le coffre. Donc, nous copions simplement la différence entre les deux branches.

    trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    

    FB supprimé que le tronc a tous les changements dont nous avons besoin.

    La dernière étape est exécutée par:

    svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev .
    svn ci
    

    Ou la différence de prise de langage ordinaire entre le tronc et les branches et les mettre au tronc ce qui les rend équivalent.

Ce modèle est décrit dans http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature

Maintenant, si cela ne fonctionne pas pour vous, alors je ne comprends pas la question.

Edit2: Pour svn-1.5

Lorsque vous travaillez avec svn-1.5 vous pouvez fusionner beaucoup plus simple:

Lorsque vous travaillez sur la branche de fonction que vous venez de fusionner les changements de temps de tronc en temps:

$ svn merge /path/to/trunk
Solve conflicts
$ svn ci

Il alignera votre FB avec tous les changements dans le coffre. A la fin de FB vous exécutez cette procédure une fois de plus pour vous assurer que tout est à jour. Le vous allez au tronc et exécutez

$ svn merge --reintegrate /path/to/fb
$ svn ci

Dans le dernier il devrait y avoir aucun conflit si vous travaillez comme indiqué.

Nous sommes une petite entreprise, donc je ne connais si notre solution appliquera à votre situation. Ce que nous faisons est une fusion-tours par tours de tronc à la branche stable. Nous pouvons le faire de 2 façons différentes: - Correction vraiment nécessaire, nous fusionner juste après avoir commis au tronc - Correction / changement dangereux. Nous attendons quelques jours jusqu'à ce que le changement soit récolement dans le coffre puis nous fusionnons

Avec cette fusion continue et nous évitons de tonnes de conflits.

Mes 2 cents.

Malheureusement, tout mentionné peut être considéré comme hacks. Mise à jour à partir du tronc sur une branche peut conduire à des problèmes très graves en l'amenant dans le tronc et ouvre la possibilité pour le pire de tous les conflits, les conflits d'arbres. Ceci est parce que les répertoires ne sont pas traités comme des citoyens de première classe. La meilleure approche consiste à utiliser Mercurial avec le l'extension SVN que votre client standard SVN. Il vous permet de continuer à utiliser SVN tout en obtenant la puissance de traitement des dossiers de Mercurial.

Ensuite, sur le côté wworkstation vous pouvez utiliser un certain nombre d'approches qui offre un éventail de fonctionnalités pour répondre à de nombreuses situations sur un seul svn. Vous pouvez utiliser patcher régulière, les files d'attente de correctifs, la mise à jour à partir d'une copie locale du tronc sans affecter le tronc commun et d'autres approches.

Cette approche fonctionne autour de tous les côtés de downn svn. J'ai eu interrupteur TTO à cette approche en raison de circonstances similaires. Même si vous n'utilisez pas cette approche immédiatement, vous devriez au moins essayer dès que possible.

Je pense que je dois prendre les gourdins pour @Artyom ici. Je pense aussi que si vous avez à

  

résoudre les conflits branche du tronc deux fois

quelque chose ne va pas. Et je pense que l'argument @Artyoms / solution est tout à fait solide.

Je crois que l'une des choses mineures @Artyom aurait pu écrire plus clair est que la fin où vous « copie » fb vous trunk n'utilisez pas svn copy mais svn merge (ou svn merge --reintegrate). Cela pourrait être la raison pour laquelle vous ne trouvez pas le modèle « copy-fusion » dans modèles communs Branching.

Comme je me bats avec la compréhension de ce que vous faites jusqu'à présent, je ne suis pas sûr que dire d'autre.

Voici ce que j'entends:

  

, nous faisons ce que nous appelons la place   "Re-branchement". Dans ce cas, lorsqu'un   importante partie de modifications du tronc est   nécessaire, une nouvelle branche de fonction est ouvert   du tronc courant, ...

Maintenant, vous avez une nouvelle branche (appelons-b2) qui est équivalent à tronc, à droite? Et est la « partie importante des modifications du tronc nécessaires »? Je suppose que dans fb?

  

... et la fusion est   toujours vers le bas (les branches fonctionnelles ->   tronc -.> branches stables)

Mais comme vous venez de créer b2 du tronc il n'y a rien à se fondre dans le tronc, non? Et vous n'êtes pas fusion des modifications de b2 à fb soit (comme ce serait le même que le tronc fusion à fb ...). Alors, comment faire les obtenir « des morceaux importants de changements » dans fb? Et une fois qu'ils sont là, pourquoi voudriez-vous les fusionner avec le tronc (puisque c'est d'où ils viennent en premier lieu)?

En fait, les liens suivants la section intitulée « " et / ou fourni dans la documentation SVN 1.4 (je sais, vous n'utilisez pas SVN 1.4 mais je crois qu'il applique de toute façon) sous Branching modèles communs pourrait aider à éclaircir certaines choses. Ces liens sont « manquants » dans la documentation 1.5 (probablement à cause de la nouvelle option --reintegrate dans merge).

Vous semblez vraiment être fusionner les mêmes changements deux fois et je pense vraiment que vous ne devriez pas (besoin de) faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top