2009-04-16 4 views
11

Nous avons plusieurs grands sous-projets dans notre racine principale du projet SVN.
Je commets et fusionnons seulement mon sous-projet lorsque je travaille avec nos branches de publication, principalement parce que c'est plus rapide.Valide et fusionne sur des sous-répertoires SVN considérés comme nuisibles?

Cependant, un collègue a cette reference to merging subdirectories in Version Control with Subversion (alias "The Book SVN"):

Malheureusement, ceci est la portée de l'avertissement. La section liée ne donne pas d'explication non plus.

La validation et la fusion de sous-répertoires SVN sont-elles dangereuses pour les branches de publication?
Qu'en est-il des branches à courte durée de vie?

+0

J'aime le titre :) – Dunaril

Répondre

14

Une explication possible est que vous pouvez oublier des parties d'un ensemble de modifications. Si la modification indique que vous fusionnez des fichiers de couverture qui se trouvent en dehors du sous-répertoire que vous avez extrait, il est toujours possible que vous oubliez de fusionner ces fichiers.

Par exemple, si vous avez un engagement comme celui-ci sur le tronc:

r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 

Change some stuff 

Et vous avez une caisse de subdir1 de votre branche « stable », alors vous pouvez ensuite fusionner la mettre r5 comme ceci:

$ svn co http://example.com/svn/branches/stable/subdir1 
$ cd subdir1 
$ svn merge -c 5 http://example.com/svn/trunk/subdir1 . 
--- Merging r5 into '.': 
U main.c 
$ svn ci -m"Merged r5 from trunk" 

Mais cela ne se fondre la moitié de la révision 5. Pire encore, si vous revenez en arrière et regardez le journal, il affiche maintenant ceci:

$ svn log -g http://example.com/svn/ 
... 
------------------------------------------------------------------------ 
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 
Merged via: r6 

Change some stuff 

Ainsi, il semble que vous ayez fusionné tout le commit, alors qu'en fait vous n'en avez fusionné qu'une partie. Bien sûr, r6 montre qu'un seul fichier a changé sur la branche stable.

------------------------------------------------------------------------ 
r6 | rich | 2009-04-16 22:28:16 +0200 (Thu, 16 Apr 2009) | 1 line 
Changed paths: 
    M /branches/stable/subdir2 
    M /branches/stable/subdir2/main.c 

Merge revision 5 from trunk 

Quelqu'un doit se rappeler, ou un avis, qu'une partie seulement de l'ensemble de changement se est fusionné et le reste a besoin de faire. Ne pas utiliser les fusions de sous-répertoires évite ce problème.

Il y a des moments où vous ne voulez vraiment pas fusionner tous les commit précédents, et le scénario ci-dessus est exactement ce que vous vouliez faire. Dans ce cas, il est probablement préférable d'ajouter un bon message de validation décrivant vos intentions.

+1

+1 - Grande réponse et exemple –

1

La validation ne devrait pas poser de problème, mais lors de la fusion, le SVN suit ce qui est ou n'est pas fusionné.

Par conséquent, je suppose que vous voulez fusionner à la racine pour simplifier les fusions futures (par rapport à la taille de l'ensemble de données comparé par SVN).

1

Pour les versions de subversion antérieures à la version 1.5, la fusion de sous-répertoires effectuée ultérieurement rend plus complexe le reste de l'arborescence de répertoires. Si vous avez fusionné un répertoire, svn a simplement appliqué toutes les modifications apportées dans ce répertoire à l'autre branche.Si vous avez déjà fusionné un sous-répertoire, puis tenté de fusionner le répertoire principal, tous les changements dans le sous-répertoire étaient déjà dans la branche cible (puisque vous les avez fusionnés auparavant). Svn ne savait pas maintenant que ces changements provenaient d'une fusion précédente, il a juste vu qu'il y avait des choses "dans le chemin" quand il a essayé de fusionner le sous-répertoire, ce qui a entraîné beaucoup de conflits. Pour éviter cela, vous auriez dû faire attention à ne fusionner que les répertoires que vous n'aviez pas fusionnés auparavant, rendant le processus beaucoup plus compliqué. Vous avez dû vous rappeler exactement quelles révisions des sous-répertoires que vous avez déjà fusionnés et appliquer uniquement les modifications restantes des répertoires/révisions restants. Cela peut être déroutant. Toujours fusionner toute la branche a rendu cela beaucoup plus facile. Les versions actuelles de subversion gardent une trace interne des fusions précédentes, de sorte que ces problèmes peuvent être évités.

La validation des sous-répertoires ne pose aucun problème. Pour svn, il s'agit simplement d'une révision globale et normale du référentiel. Dans cette révision, il n'y aura que des changements dans un sous-répertoire, mais pour svn c'est toujours une nouvelle version de l'ensemble du dépôt, tout comme n'importe quel autre commit.

+2

Dans svn 1.5+ ce n'est pas vraiment le cas. La fusion d'un sous-répertoire, puis la fusion du reste du même commit à partir de la racine ne "re-fusionne" pas les éléments déjà fusionnés dans le sous-répertoire provoquant un conflit. La propriété svn: mergeinfo empêche cela. – richq

+0

Content de l'entendre. Cela a vraiment fait fusionner les subversions inutilement et de manière agaçante complexe, au point d'inutilité. – sth

5

Une autre raison à cela pourrait être que la fusion à la racine limite le nombre de propriétés svn: mergeinfo qui vont être définies sur les dossiers/fichiers de votre dépôt.

+0

Votre réponse est plus dans l'esprit de ma question, merci. Mon intuition est que puisque nos sous-projets ne sont profonds que d'un niveau, la définition de mergeinfo sur l'un de ceux-ci serait toujours raisonnable. – mskfisher

Questions connexes