Разбить большой репо на несколько подпунктов и сохранить историю (Mercurial)

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

Так что это легко сделать, просто нажав hg init'ing в каталогах проекта. Но можно ли это сделать при сохранении истории? Или есть лучший способ устроить это?

РЕДАКТИРОВАТЬ::::

Благодаря ответу 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 ответ

Решение

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

  1. конвертировать все в один репозиторий HG, используя hg convert с исходным типом svn и типом dest hg (похоже, вы уже сделали этот шаг)
  2. создать коллекцию filemap файлы для использования с hg convert"s --filemap вариант
  3. бежать hg convert с типом источника hg и тип Dest hg и источником является mercurial репозиторий, созданный на первом этапе, - и сделайте это для каждого из файловых карт, созданных на втором шаге.

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

и так далее.

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

Другие вопросы по тегам