2010-06-17 63 views
29

我們有包含在SVN一個目錄多個共享工程,解決方案文件等代碼的大型基地。我們正在遷移到Mercurial。我想借此機會將我們的代碼重組爲幾個存儲庫,以便爲分支創建克隆的開銷更小。我已經成功地將我們的回購從SVN轉換爲Mercurial,同時保留了歷史。我的問題:我如何在保留歷史記錄的同時將所有不同的項目分解爲獨立的存儲庫?拆分大型回購成多個subrepos和保存歷史(水銀)

這裏是什麼我們的單一存儲庫(OurPlatform)目前看起來像一個例子:

/OurPlatform 
---- Core 
---- Core.Tests 
---- Database 
---- Database.Tests 
---- CMS 
---- CMS.Tests 
---- Product1.Domain 
---- Product1.Stresstester 
---- Product1.Web 
---- Product1.Web.Tests 
---- Product2.Domain 
---- Product2.Stresstester 
---- Product2.Web 
---- Product2.Web.Tests 
==== Product1.sln 
==== Product2.sln 

所有這些都包含VS項目除了解決方案文件的文件夾。 Product1.sln和Product2.sln都引用所有其他項目。理想情況下,我想將每個文件夾都轉換成獨立的汞回收站,併爲每個項目添加新的回購站(它們將作爲母公司回購站)。然後,如果有人要對產品1的工作,他們會克隆產品1回購,其中載Product1.sln和subrepo引用ReferenceAssemblies,核心,Core.Tests,數據庫,Database.Tests,CMS和CMS.Tests。

因此,很容易通過只是HG在項目目錄init'ing做到這一點。但是,在保存歷史的同時能做到嗎?或者有更好的方法來安排這個?

編輯::::

由於Ry4an的回答,我能夠實現我的目標。我想分享我是如何爲別人做到的。

因爲我們有很多不同的項目,我寫了一個小bash腳本來自動創建filemaps併產生最終的蝙蝠腳本來真正做轉換。答案並不完全清楚的是,convert命令需要爲每個文件映射運行一次,以便爲每個項目生成一個單獨的存儲庫。該腳本將被放置在您之前轉換的svn工作副本上方的目錄中。我使用了工作副本,因爲它的文件結構與我想要的最終新的hg回購相匹配。

#!/bin/bash 

# this requires you to be in: /path/to/svn/working/copy/, and issue: ../filemaplister.sh ./ 

for filename in * 
do 
    extension=${filename##*.} #$filename|awk -F . '{print $NF}' 
    if [ "$extension" == "sln" -o "$extension" == "suo" -o "$extension" == "vsmdi" ]; then 
    base=${filename%.*} 
    echo "#$base.filemap" >> "$base.filemap" 
    echo "include $filename" >> "$base.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $base.filemap ../hg-datesort-converted ../hg-separated/$base > $base.convert.output.txt" >> "MASTERGO.convert.bat" 
    else 
    echo "#$filename.filemap" >> "$filename.filemap" 
    echo "include $filename" >> "$filename.filemap" 
    echo "rename $filename ." >> "$filename.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $filename.filemap ../hg-datesort-converted ../hg-separated/$filename > $filename.convert.output.txt" >> "MASTERGO.convert.bat" 
    fi 
done; 

mv *.filemap ../hg-conversion-filemaps/ 
mv *.convert.bat ../hg-conversion-filemaps/ 

這個腳本着眼於一個svn工作拷貝的每一個文件,並根據類型或者創建一個新的文件filemap或追加到一個現有的。 if實際上只是爲了捕獲misc visual studio文件,並將它們放入單獨的repo中。這是爲了在bash上運行(在我的情況下爲cygwin),但運行實際的轉換命令是通過使用TortoiseHg附帶的hg版本完成的,因爲Windows上的分支/進程問題(gah,我知道...)。

所以你運行MASTERGO.convert.bat文件,着眼於轉換後汞回購,並創建使用所提供的filemap單獨回購。完成後,會有一個名爲hg-separated的文件夾,其中包含每個項目的文件夾/ repo以及每個解決方案的文件夾/ repo。然後,您必須手動將所有項目克隆到解決方案庫中,然後將克隆添加到.hgsub文件中。提交後,會創建一個.hgsubstate文件,然後您就可以開始了!

與上面給出的例子,我.hgsub文件看起來像這樣的「產品1」:

Product1.Domain = /absolute/path/to/Product1.Domain 
Product1.Stresstester = /absolute/path/to/Product1.Stresstester 
Product1.Web = /absolute/path/to/Product1.Web 
Product1.Web.Tests = /absolute/path/to/Product1.Web.Tests 

一旦我這些回購協議傳輸到中央服務器,我將手動更改路徑是網址。

此外,也沒有模擬到初始OurPlatform svn的,因爲一切現在分離。再次

謝謝!

回答

28

這絕對可以做到。您需要使用hg convert命令。具體的過程我會使用:

  1. 所有內容轉換到使用hg convert與源類型的svn和汞的目標類型的單一汞庫(這聽起來像你已經做了這一步)
  2. 創建filemap文件中使用的收集與hg convert--filemap選項
  3. 運行hg convert與源類型hg和dest型hg和源是在創建一個步驟善變回購 - 也爲了每個創建的filemaps的在第二步。

的filemap語法顯示在hg help convert輸出,但這裏的要點是:

The filemap is a file that allows filtering and remapping of files and 
directories. Comment lines start with '#'. Each line can contain one of 
the following directives: 

    include path/to/file 

    exclude path/to/file 

    rename from/file to/file 
在你的榜樣

所以你filemaps應該是這樣的:

# this is Core.filemap 
include Core 
rename Core . 

請注意,如果您有一個包括排除其他所有內容的暗示。此外,該重命名行以點結束,並將所有內容向上移動一級。

# this is Core.Tests 
include Core.Tests 
rename Core.Tests . 

等等。

一旦爲每個新回購庫創建了細分存儲庫,您可以刪除在第一步中創建的has-everything初始回購站,並開始在.hgsub文件中設置您的subrepo配置。

+0

謝謝,這是完美的! – Andrew 2010-06-21 16:45:46

+5

如果這不起作用,請記住您必須在新的回購庫上調用「hg update」才能顯示文件。我錯過了這部分... – bsk 2010-09-08 17:18:29

+0

這是真的,你的新回購有歷史,但你沒有得到工作目錄副本,直到你'hg update' – 2013-05-24 12:07:51