You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@subversion.apache.org by Eric Horne <su...@box11.org> on 2010/12/07 15:29:19 UTC

avoiding tree conflicts in controlled website

Hello subversion users. I have a 'how-would-you-do-this' question for 
you. An answer wasn't apparent on google or recent SVN mail archives, so 
I'm hoping you kind folks can help.

Subversion is controlling change to a website I manage (running the CMS 
Joomla!) , which is to say subversion holds the source of record for 
what is supposed to be public. We have third party extensions installed 
on the site as well. From time-to-time the extensions (and Joomla! 
itself) are altered to our specifications. The desire is to use 
subversion to track changes, and more importantly manage our localized 
changes against incoming changes from the third-party extensions (and 
updates from Joomla! )

What I have done is I've created a trunk for the base Joomla! release 
and branched that trunk into a site specific branch. Similarly, I would 
like to place the unbundled extensions into their own trunks in the same 
repo and branch them when a local change is needed, and then merge that 
branch into into the website's branch. For example, the website contains 
a top-level 'components' directory. An extension adds stuff inside that 
directory to make 'components/com_mystuff/...'.

Here's the rub: when I import the base extension code subversion wants 
to create the 'components' directory as a new entity creating an 'evil 
twin' (in ClearCase lingo). So when I go to merge the extension branch 
into the website branch, I get a tree-conflict and no merge of the 
directory. Note that extensions probably also go into more than just the 
'components' directory (they could also go into 
'administrator/components', 'plugins/content', 'languages', or any 
number of other places).

A solution that seems to work is to branch the Joomla! base into the 
extension branch first, then manually merge all the new directories (an 
extension should NEVER change an existing file, it will always be new) 
from the extension I want to add into the extension branch. Check in and 
merge into the website branch. While it works, it seems very 
heavy-handed (checking out 9000+ files/directories to add new structure 
that affects a very small percentage of those checked out items).

Another solution is to first create the common directory structure and 
import that first. Then add the new files, and merge from that revision 
forward (skipping the initial import). While it also works, it will 
break the first time a component update adds a new common directory and 
I don't catch it first. Plus it still creates the evil twins, they are 
just ignored; that seems less than robust.

Similar to the one above, I could branch the individual new directories, 
but I think I still end up with the contents of those directories (e.g. 
merging just 'components', I'd get 'components/com_notrelated1' and 
'components/com_notrelated2', ... so less than all the files in Joomla!, 
but still quite a few). This would also force me to individually branch 
each common directory, which seems like a lot of tedious and error-prone 
prework.

The final, and least attractive solution I thought of was to merge from 
the new directory levels and below. This is really not something I want 
to do because it requires remembering which directories are common and 
which aren't, and it would require 4 or 5 merge attempts (one for each 
new directory under a common directory). And if it starts adding files 
into common directories, I'd have to merge each individual file. yikes!

Ideally, there would be a way to merge the two top-level directories 
without getting a tree-conflict, in a single merge attempt without 
having to checkout files or directories that are not involved in the 
merge. Are there better approaches that I'm not thinking of?

Thanks for your help!

-Eric