2010-08-23 4 views
0

J'utilise svn pour la première fois, pour maintenir une version personnalisée de Wordpress. J'utilise le plugin subclipse dans eclipse. Le moment est venu de fusionner les changements dans la dernière version de Wordpress avec ma base de code personnalisée. J'ai essayé de créer une branche et d'y ajouter la nouvelle version de Wordpress, puis d'effectuer une fusion. Aucun changement n'a été fait cependant. Est-ce que quelqu'un pourrait me guider dans la configuration du projet comme ça? Je crains de manquer quelque chose de basique. Merci.Comment fusionner les modifications de code en utilisant subclipse?

Répondre

1

Conversion projet wordpress au vendeur procédure de branche

Si vous utilisez svn pour la première fois que je suppose que vous n'avez pas commencé avec une copie wordpress propre, ramifiée à partir de là et modifié la version ramifiée, avez-vous?;)

Si tel est le cas, vous pourriez avoir un problème entre vos mains.


Contexte

Contrairement SVN "diffs réguliers" fusion ne compare pas le code côté droit/dossiers avec le code côté gauche/dossiers. Alors que svn merge pourrait retomber dans un mécanisme semblable à un diff s'il ne trouve pas d'historique, je ne recommanderais pas de faire appel à ce mécanisme car il peut être sujet à des conflits inutiles.

La fusion SVN est utilisée pour reproduire les modifications qui ont été enregistrées dans l'historique SVN. C'est comme si on disait à un peintre "Hey tu sais comment cette photo a regardé avant que tu ajoutes cet arbre sur la colline? Cet arbre était génial! Regarde ici j'ai copié la même image de base mais maintenant c'est avec un coucher de soleil. Encore un arbre mais sur cette photo avec le coucher de soleil? " Le peintre pourrait peut-être reproduire l'arbre parce qu'il sait comment il l'a fait. Il pourrait même avoir un brouillon quelque part.

L'image, c'est wordpress. Le peintre, son svn avec vous le commandant. L'arbre c'est vos modifications. L'image maintenant sur le thème du coucher de soleil est la version wordpress la plus récente.

Ce que vous avez probablement fait est de copier wordpress vanilla dans votre svn, de le modifier, de l'utiliser. Pour coller à l'exemple de l'image, l'historique contiendrait des commandes telles que "copier une image entière, ajouter une arborescence, ajouter des feuilles".

Maintenant, vous apportez une nouvelle version de wordpress, une nouvelle image pour ainsi dire et le mettre à côté de votre ancienne version modifiée. Le problème est, vous humain et intelligent savez à peu près la même image et même si la nouvelle version est différente, vous avez juste à copier l'arbre, SVN n'a pas cette connaissance. Pour SVN votre dossier Wordpress 1.7 (modifié) est complètement distinct de wordpress 1.8. Ils ne partagent aucun historique car rien dans le journal SVN ne l'indique. SVN est un snob bureaucratique n'est-ce pas? ;)

Maintenant, ce que les gens font pour permettre à svn de maintenir cette connexion historique entre wordpress 1.7, votre 1.7 modifié et le nouveau 1.8 est qu'ils utilisent branchement dès le début de leurs travaux.

Donc, vous commenceriez avec un wordpress 1.7 propre dans un dossier "vanilla-wordpress", stockez-le dans svn et branchez-le, disons, "my-modified-wp". Là vous bidouillez jusqu'à ce que vous ayez envie de mettre à jour wordpress de l'amont. Les gens téléchargent alors la dernière copie de wordpress remplacent leur wordpress de vanille et fusionnent le changeset résultant.

Dans l'exemple image commandes seraient celles-ci:

"Buy original picture 
copy original picture as my picture 
draw tree on my picture 
draw sunset on original picture (someone else did that for you, aka update) 
*reproduce* sunset on my picture too" 

Vous pouvez reproduire proprement le coucher du soleil parce que vous savez comment l'image était avant le coucher du soleil a été appliqué. Cependant, votre problème est que vous n'avez pas démarré mais que vous avez modifié votre wordpress immédiatement. Ainsi, votre nouvelle copie de wordpress ne peut pas être facilement associée à votre version modifiée.


Une façon d'établir des relations d'histoire

download the **exact** wordpress version you started your project with 
Put it into /vendor/wordpress/current 
invoke "svn copy http://svnserver.tld/repositorypath/vendor/wordpress/current http://svnserver.tld/repositorypath/vendor/wordpress/1.7.1" to tag the import. 
invoke "svn copy http://svnserver.tld/repositorypath/vendor/wordpress/current http://svnserver.tld/repositorypath/branches/my-new-modified-wordpress" or whatever your project/WP-edition is called. 

Maintenant vient la partie trick Faire défiler le journal de retour svn de votre "vieux-modifié wordpress". Celui que tu n'as pas ramifié. Vous devez trouver la première révision après votre importation initiale de l'ancien wordpress. Une fois que vous avez trouvé cette révision que vous prenez son numéro et l'utiliser dans la seconde de ces deux commandes:

change into a local checkout of "/branches/my-new-modified-wordpress" 
issue "svn merge -r **4**:HEAD http://svnserver.tld/repositorypath/my-**old**-modified-wordpress". If 4 was the first revision during which you made own modifications. 

Vous dites svn ce qui suit: « Prenez tous les changements dans ma vieille branche entre la révision 4 et maintenant et reproduire eux sur ma nouvelle branche. "

Si tout fonctionne, vous devriez avoir deux branches identiques. l'ancien-modifié et le nouveau-modifié avec la légère différence que le nouveau-modifié a une histoire solide avec votre branche "/ vendeur/wordpress/current".

Cette ascendance vous permet de faire contunously les éléments suivants:

Download the wordpress version you wish to upgrade too and **overwrite** /vendor/wordpress/current 
invoke "svn copy http://svnserver.tld/repositorypath/vendor/wordpress/current http://svnserver.tld/repositorypath/vendor/wordpress/1.9.3" to tag the new version. 
change into local checkout /branches/my-new-modified-wordpress 
issue "svn merge http://svnserver.tld/repositorypath/vendor/wordpress/current" 
profit 

Cette procédure, je décris avec moins storystelling au lien allready. Mais avant que cela puisse fonctionner, vous devez établir la relation d'ascendance entre les branches.

Subversion svn:externals file override?

Je sais qu'il a été grand-chose à lire :). Si vous envisagez de dessiner, pensez à "changer les commandes" et non pas aux états et tout ira bien.

C

+0

Merci Cristoph pour votre explication claire. Vous avez bien résumé ma situation. C'est utile en soi car je vais maintenant savoir comment mettre en place de futurs projets. Je vais essayer de trier mon projet actuel en utilisant vos instructions, mais votre vue d'ensemble a été particulièrement utile. – Lemmy

2

C'est en supposant que vous fusionnez debranch (contenant la dernière version de Wordpress) àtrunk (votre base de code personnalisé).

  1. (Assurez-vous que vous avez commis tout ce dont vous avez besoin dans branch.)

  2. Team --> Switch to another branch/tag/revision... votre copie de travail à trunk (la cible de votre opération de fusion ) et résoudre tous les conflits qui viennent jusqu'à à ce stade.

  3. Team --> Merge ouvre une boîte de dialogue dans laquelle vous allez effectuer l'opération de fusion. Remplacez l'URL "De" par la référence branch (source de votre opération de fusion, c'est-à-dire ce que vous voulez fusionner dans votre copie de travail). "De révision" doit pointer vers la révision dans branch où vous voulez que votre opération de fusion "commence" à partir de - généralement la dernière version fusionnée de branch à trunk (ou plus probablement la révision de la tête dans votre cas, si vous voulez vraiment fusionner juste les derniers changements dans branch).

  4. Définissez "À réviser" pour pointer vers la dernière révision dans branch (= la révision de la tête). À ce stade, vous êtes prêt à effectuer la fusion. La commande Dry run vous permet de prévisualiser ce qui se produit pendant la fusion et Merge exécute la fusion. Une fois l'opération de fusion terminée, vous devez vous assurer que toutes les modifications apportées à votre copie de travail sont correctes et résoudre tous les conflits. Lorsque vous avez résolu les conflits et passé en revue les modifications, validez les modifications en trunk en une seule opération de validation. Pour votre commodité, il est fortement recommandé d'ajouter un message de commit où vous spécifiez spécifiquement à quoi sert cette validation (= fusion des révisions de X à Y de branch à trunk, quel était le but, etc.).

Espérons que cela aide.

+1

Ceci est vraiment utile Tommi. Je vais essayer et rapporter ... – Lemmy

+0

C'est génial d'entendre ça. Et si cette réponse arrive à résoudre votre problème, s'il vous plaît marquer comme la bonne réponse - c'est la façon dont ce site fonctionne. Merci. – Tommi

+0

Vous mentionnez la branche à l'étape n ° 3 et l'étape n ° 4, de sorte que la fusion résultante ne serait pas le résultat souhaité pour ce scénario. En suivant les instructions de l'aide de Subclipse intitulée Fusionner deux arbres différents, l'étape # 3 devrait plutôt ressembler à ceci: 3.Team -> Merge ouvre une boîte de dialogue dans laquelle vous allez effectuer l'opération de fusion. Changez l'URL "De" en référence ** ** (le point de départ de votre opération de fusion). "From Revision" doit pointer vers la révision dans le tronc où vous voulez que votre opération de fusion commence par **. – michaelok

Questions connexes