Разбить большое репо на несколько подпунктов и сохранить историю (Mercurial) - PullRequest
29 голосов
/ 18 июня 2010

У нас есть большая база кода, которая содержит несколько общих проектов, файлов решений и т. Д. В одном каталоге в 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, так как теперь все разделено.

Еще раз спасибо!

1 Ответ

28 голосов
/ 18 июня 2010

Это абсолютно возможно.Вы захотите использовать команду hg convert.Вот процесс, который я бы использовал:

  1. конвертирование всего в один репозиторий hg, используя hg convert с типом источника svn и типом dest hg (похоже, вы уже сделали этоstep)
  2. создать коллекцию filemap файлов для использования с hg convert --filemap option
  3. run hg convert с типом источника hg и типом назначения hgа источником является Mercurial Repo, созданный на первом этапе, - и сделайте это для каждого из файловых карт, созданных на втором этапе.

Синтаксис файловой карты показан в выводе 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

Итак, в вашем примере ваши файловые карты будут выглядеть так:

# this is Core.filemap
include Core
rename Core .

Обратите внимание, что если у вас есть включение, подразумевается исключение всего остального.Кроме того, эта строка переименования заканчивается точкой и перемещает все на один уровень вверх.

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

и т. Д.

Как только вы создали разбитые репозитории для каждого из новых репозиториев, вы можете удалить начальное хранилище has-everything, созданное на первом шаге, и начать настройку конфигурации субрепо в файлах .hgsub.

...