当trunk/branch/tag结构混乱时,如何从Subversion迁移到Mercurial?

use*_*063 7 svn migration git mercurial bazaar

我想将存储库从Subversion转换为Mercurial,但是当我最初设置存储库时,我是以最懒的方式做到的.随着时间的推移,结构继续变形和恶化(此时为5年).尽管如此,我还是希望保留尽可能多的历史,即使我必须弄脏并手动将东西拼凑在一起.

不用多说,目前的结构如下:

svn://svn.example.com/Example
    + trunk
        + BigProject
        + BinaryDepedencies
    + branches
        + BigProject
            + branch1
            + feature1
            + maintenance1
            + ...
    + tags
        + BigProject
            + tag1
            + tag2
            + ...
    + projects
        + small_project1
        + small_project2
        + small_project3
        + ...
Run Code Online (Sandbox Code Playgroud)

鉴于这只是最新的结构,这个存储库有什么希望吗?如果没有希望,任何人都有很好的方法在Mercurial(或集市)手工重建历史.

此外,由于各种原因,我将无法使用git,除非有一个防弹策略将这个特定的repo从Subversion转换为git到hg/bzr.

Omn*_*ous 7

一种策略可能是转换主干.如果你的后备箱已经移动,你可能不得不玩一些游戏,但它不应该太难.

你的武器库中的另一个工具可能是hg-> hg转换和rebase扩展.在hg存储库中有东西后,你可以使用它们来摆弄你的树,并在你转换它们之后移植到树枝上.移动后,移植到树干历史的新部分.

这是关于Mercurial rebase扩展的文档的一个很好的链接.

基本上,这是你要遵循的策略......首先,使用convert扩展hgsvn转换存储库的部分.这可能会导致多行主干,或者在与主线位于不同存储库中的分支中.

如果在单独的存储库中有两个trunk部分,并且second直接调用的目录中的一个部分跟在被调用目录中的那个部分之后first,则可以执行以下操作:

cd second
hg log -r 0
# Note the revision hash
cd ../first
hg tip
# Again, note the revision hash
hg pull -f ../second
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip>
Run Code Online (Sandbox Code Playgroud)

这会将一段行李箱移植到另一段行李箱上.

如果您在一个单独的存储库中有一个分支,则该过程稍微复杂一些:

cd branch
hg log -r 0
# Note the revision hash
cd ../trunk
# Find the revision that the branch branches off from and note its hash.
# We will call this revision the 'branch base'.
hg pull -f ../branch
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base>
Run Code Online (Sandbox Code Playgroud)

这将把树枝移植到主树上.