2010-01-20 46 views
7

我想從Subversion將存儲庫轉換爲Mercurial,但是當我最初設置存儲庫時,我是以最懶惰的方式完成的。隨着時間的推移,結構繼續變形並惡化(此時已有5年)。儘管如此,我仍希望保留儘可能多的歷史記錄,即使我必須弄髒並手工縫合東西。當trunk/branch/tag結構混亂時,如何從Subversion遷移到Mercurial?

事不宜遲,目前的結構看起來像這樣:

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(或集市)手工重建歷史。

此外,由於各種原因,我將無法使用git,除非有一個防彈策略將此特定repo從Subversion轉換爲git到hg/bzr。

+0

很快就會有一個新的良好答案。 reposurgeon正在增加導入Subversion的能力,而且看起來這種能力有很多關心和關注:http://esr.ibiblio.org/?p=4071 – Omnifarious 2012-01-25 04:27:44

回答

7

一種策略可能是轉換主幹。如果你的箱子移動了,你可能不得不玩一些遊戲,但它不應該太難。

你的武器庫中的另一個工具可能是hg-> hg轉換和rebase擴展。您可以使用這些工具在您將某個物品存放在hg存儲庫中並在您轉換它們之後在分支上進行嫁接之後,使用它們來擺弄您的樹。或移動後,移植到你的行李箱歷史記錄中。

這是一個鏈接到Mercurial rebase extension文檔的不錯鏈接。

基本上,您應遵循以下策略......首先,使用convert extensionhgsvn轉換存儲庫的某些部分。這可能會導致多行中繼線,或者位於與主線分開存放的分支中。

如果你有不同的版本庫主幹的兩個部分,一個名爲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> 

這將嫁接分支到主樹。

+0

你能解釋如何在分支機構上移植嗎? hg-> hg的想法聽起來很有希望。 – user255063 2010-01-20 17:31:00

+0

@throttled - 在那裏,我做了更多的嘗試來解釋。 :-) – Omnifarious 2010-01-20 18:28:15

+0

太棒了,謝謝。這讓我有點咀嚼。 – user255063 2010-01-20 19:33:17

3

根據convert extension's docs,像下面這樣的東西應該工作。

$ 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 
+1

非常好的建議,似乎我可以嘗試使用相同的策略將小項目拆分爲自己的回購。 – user255063 2010-01-20 17:32:31