Using "hg convert" on repos with multiple branches

29 views
Skip to first unread message

Scott Jarvi

unread,
Sep 11, 2012, 4:39:15 PM9/11/12
to merc...@selenic.com
Hi,

We're in the process of trying to collapse some of our Hg repos into a single repository.   The "convert" extension seems to be the right fit, but I'm not sure how the branches within each repo will be merged into the new repo.    An example - we have two separate repos, "old_repo1" and "old_repo2" both with named branches that have the same name:

old_repo1
- default
- branchA
- branchB

old_repo2
- default
- branchA
- branchB

We want old_repo1 & old_repo2 to become subdirectories of new_repo, but retain the branches and history.

new_repo
 /old_repo1
 /old_repo2
- default
- branchA
- branchB


Is this possible, and if so, what is the recommended approach here?

Thank you,
Scott


Greg Ward

unread,
Sep 11, 2012, 8:30:00 PM9/11/12
to Scott Jarvi, merc...@selenic.com
There's more than one way to do it. The simplest, most
straightforward, least clever, least magical is:

* create new_repo
* pull from old_repo1 into it
* move all files into old_repo1
(repeat for each branch -- or do it on the earliest branch and
merge forward, if these are chronological release branches)
* pull from old_repo2 -- that will create a separate root and
new heads on each named branch
* move all files into old_repo2 (again, repeat for each branch)
* merge the two heads of branchB
* merge the two heads of branchA
* merge the two heads of default

This accurately preserves the history of what you did, with no "hg
convert" trickery to magically change history.

Downsides:
* you always need to remember "hg log -f" to follow renames
* if the two old_repos are big (thousands of files), then those
two "rename everything" changesets will be annoyingly big:
- "hg log -v" will be overwhelmed by the long list of renamed files
- looking at them in hgweb will be slow

Alternately, you can use "hg convert" to magically change history.
That saves you from needing to remember "hg log -f", and avoids the
annoyingly large "rename everything" changesets. It does *not* save
you from:

* a repository with multiple roots, which is a bit weird --
if you update back to old changesets, either old_repo1/ or
old_repo2/ completely disappears (don't worry, multi-root
repos work just fine, they're just a bit weird, and certain
Mercurial gurus -- notably Matt Mackall -- frown on them)
* you have to merge heads on branchA, branchB, and default
so that future history has both old_repo1/ and old_repo2/

I've done this a couple of times. Everything works just fine, but it's
up to you to do merge heads together. "hg convert" doesn't do it for
you.

Greg
--
Greg Ward http://www.gerg.ca/
"Sure it's portable -- it works on Windows 95 *and* 98!"
_______________________________________________
Mercurial mailing list
Merc...@selenic.com
http://selenic.com/mailman/listinfo/mercurial
Reply all
Reply to author
Forward
0 new messages