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.
一种策略可能是转换主干.如果你的后备箱已经移动,你可能不得不玩一些游戏,但它不应该太难.
你的武器库中的另一个工具可能是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)
这将把树枝移植到主树上.