7

我想将存储库从 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
        + ...

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

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

4

2 回答 2

7

一种策略可能是转换主干。如果您的后备箱移动了,您可能需要玩一些游戏,但这不应该太难。

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

这是Mercurial rebase extension文档的一个很好的链接。

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

如果您在不同的存储库中有两个主干部分,并且目录中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>

这会将一部分躯干移植到另一部分躯干上。

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

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>

这会将树枝嫁接到主树上。

于 2010-01-20T17:16:50.903 回答
3

根据转换扩展的文档,类似以下的内容应该可以工作。

$ cat > ~/.hgrc <<EOF
[extensions]
hgext.convert=
EOF
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo
于 2010-01-20T17:20:52.810 回答