У нас есть большая база кода, которая содержит несколько общих проектов, файлов решений и т. Д. В одном каталоге в SVN. Мы мигрируем в Mercurial. Я хотел бы воспользоваться этой возможностью, чтобы реорганизовать наш код в несколько репозиториев, чтобы клонирование для ветвления было менее затратным. Я уже успешно конвертировал репо из SVN в Mercurial, сохранив историю. Мой вопрос: как мне разбить все разные проекты на отдельные репозитории при сохранении их истории?
Вот пример того, как выглядит наш единственный репозиторий (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 Projects, за исключением файлов решения. Product1.sln и Product2.sln ссылаются на все остальные проекты. В идеале я хотел бы взять каждую из этих папок и превратить их в отдельные репозитории Hg, а также добавить новые репозитории для каждого проекта (они будут действовать как родительские репозитории). Затем, если кто-то собирается работать с Product1, он клонирует репозиторий Product1, который содержит ссылки Product1.sln и subrepo на ReferenceAssemblies, Core, Core.Tests, Database, Database.Tests, CMS и CMS.Tests.
Итак, это легко сделать, просто запустив initg в каталогах проекта. Но можно ли это сделать при сохранении истории? Или есть лучший способ это устроить?
EDIT ::::
Благодаря ответу Ry4an я смог достичь своей цели. Я хотел поделиться с другими тем, как я это сделал.
Поскольку у нас было много отдельных проектов, я написал небольшой сценарий bash для автоматизации создания файловых карт и создания окончательного сценария bat, который фактически выполняет преобразование. Что было не совсем очевидно из ответа, так это то, что команду 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 и в зависимости от типа создает новый файл карты или добавляет к существующему. If на самом деле просто для того, чтобы перехватывать файлы misc visual studio и помещать их в отдельный репозиторий. Это предназначено для запуска на bash (в моем случае это cygwin), но фактическая команда преобразования выполняется через версию hg, поставляемую с TortoiseHg, из-за проблем с разветвлением / обработкой в Windows (да, я знаю ...)
Итак, вы запускаете файл MASTERGO.convert.bat, который просматривает ваше конвертированное репозиторий hg и создает отдельные репозитории с использованием прилагаемой карты файлов. После его завершения есть папка hg-separated, которая содержит папку / repo для каждого проекта, а также папку / repo для каждого решения. Затем вам нужно вручную клонировать все проекты в репозиторий решений и добавить клоны в файл .hgsub. После фиксации создается файл .hgsubstate, и вы готовы к работе!
В приведенном выше примере мой файл .hgsub выглядит так: «Product1»:
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
Как только я перенесу эти репозитории на центральный сервер, я буду вручную изменять пути, которые будут URL-адресами.
Также нет аналога исходному репозиторию OurPlatform svn, так как теперь все разделено.
Еще раз спасибо!