我們有包含在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的,因爲一切現在分離。再次
謝謝!
謝謝,這是完美的! – Andrew 2010-06-21 16:45:46
如果這不起作用,請記住您必須在新的回購庫上調用「hg update」才能顯示文件。我錯過了這部分... – bsk 2010-09-08 17:18:29
這是真的,你的新回購有歷史,但你沒有得到工作目錄副本,直到你'hg update' – 2013-05-24 12:07:51