[Python-Dev] PEP: Migrating the Python CVS to Subversion
Donovan Baarda
abo at minkirri.apana.org.au
Mon Aug 8 00:12:36 CEST 2005
Martin v. Löwis wrote:
> Donovan Baarda wrote:
>
>>Yeah. IMHO the sadest thing about SVN is it doesn't do branch/merge
>>properly. All the other cool stuff like renames etc is kinda undone by
>>that. For a definition of properly, see;
>>
>>http://prcs.sourceforge.net/merge.html
>
>
> Can you please elaborate? I read the page, and it seems to me that
> subversion's merge command works exactly the way described on the
> page.
maybe it's changed since I last looked at it, but last time I looked SVN
didn't track merge histories. From the svnbook;
"Unfortunately, Subversion is not such a system. Like CVS, Subversion
1.0 does not yet record any information about merge operations. When you
commit local modifications, the repository has no idea whether those
changes came from running svn merge, or from just hand-editing the files."
What this means is SVN has no way of automatically identifying the
common version. An svn merge requires you to manually identify and
specify the "last common point" where the branch was created or last
merged. PRCS automatically finds the common version from the
branch/merge history, and even remembers the
merge/replace/nothing/delete decision you make for each file as the
default to use for future merges.
You can see this in the command line differences. For subversion;
# create and checkout branch my-calc-branch
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
# merge and commit changes from trunk
$ svn merge -r 341:HEAD http://svn.example.com/repos/calc/trunk
$ svn commit -m "Merged trunc changes to my-calc-branch."
# merge and commit more changes from trunk
$ svn merge -r 345:HEAD http://svn.example.com/repos/calc/trunk
$ svn commit -m "Merged trunc changes to my-calc-branch."
Note that 341 and 345 are "magic" version numbers which correspond to
the trunc version at the time of branch and first merge respectively. It
is up to the user to figure out these versions using either meticulous
use of tags or svn logs.
In PRCS;
# create and checkout branch my-calc-branch
$ prcs checkout calc -r 0
$ prcs checkin -r my-calc-branch -m "Creating my-calc-branch"
# merge and commit changes from trunk
$ prcs merge -r 0
$ prcs checkin -m " merged changes from trunk"
# merge and commit more changes from trunk
$ prcs merge -r 0
$ prcs checkin -m " merged changes from trunk"
Note that "-R 0" means "HEAD of trunk branch", and "-r my-calc-branch"
means "HEAD of my-calc-branch". There is no need to figure out what
versions of those branches to use as the "changes from" point, because
PRCS figures it out for you. Not only that, but if you chose to ignore
changes in certain files during the first merge, the second merge will
remember that as the default action for the second merge.
--
Donovan Baarda
More information about the Python-Dev
mailing list