Разделите большой repo на несколько subrepos и сохраните (Подвижную) историю

У нас есть большая основа кода, который содержит несколько общих проектов, файлов решения, и т.д. в одном каталоге в SVN. Мы мигрируем на Подвижный. Я хотел бы воспользоваться этой возможностью для реорганизации нашего кода в несколько репозиториев, чтобы заставить клонирование для ветвления иметь меньше служебное. Я уже успешно преобразовал наш repo от SVN до Подвижного при сохранении истории. Мой вопрос: как я повреждаю все различные проекты в отдельные репозитории при сохранении их истории?

Вот пример того, на что в настоящее время похож наш единый репозиторий (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 обе ссылки все другие проекты. Идеально, я хотел бы взять каждую из тех папок, и превратить их в отдельный Hg repos и также добавить новый repos для каждого проекта (они будут действовать как родитель repos). Затем Если бы кто-то собирался работать над Product1, то они клонировали бы Product1 repo, который содержал Product1.sln и subrepo ссылки на ReferenceAssemblies, Ядро, Ядро. Тесты, База данных, База данных. Тесты, CMS и CMS.Tests.

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

Править::::

Благодаря ответу Ry4an я смог выполнить свою цель. Я хотел совместно использовать, как я сделал это здесь для других.

Так как у нас было много отдельных проектов, я записал маленький сценарий удара, чтобы автоматизировать создание filemaps и создать заключительный bat сценарий, чтобы на самом деле сделать преобразование. То, что не было абсолютно очевидно из ответа, то, что преобразование управляет, чтобы потребности были выполнены однажды для каждого filemap, произвели отдельный репозиторий для каждого проекта. Этот сценарий был бы помещен в каталог выше svn, работающего копия, которую Вы ранее преобразовали. Я использовал рабочую копию, так как это - файловая структура, лучше всего соответствовал тому, чем я хотел, чтобы заключительный новый hg repos был.

#!/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 файл или добавляет к существующему. Если должен действительно только поймать misc файлы Visual Studio и разместить их в отдельный repo. Это предназначено, чтобы быть выполненным на ударе (cygwin в моем случае), но выполнение фактической команды преобразования выполняется через версию hg, поставленного с TortoiseHg из-за разветвления/процесса проблем о Windows (gah, я знаю...).

Таким образом, Вы выполняете файл MASTERGO.convert.bat, который смотрит на Ваш преобразованный hg repo и создает отдельный repos использование предоставленного filemap. После того, как это завершено, существует папка, названная hg-separated, который содержит folder/repo для каждого проекта, а также folder/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

После того как я передаю эти repos центральному серверу, я буду вручную изменять пути, чтобы быть URL.

Кроме того, нет никакого аналога к начальному OurPlatform svn repo, так как все разделяется теперь.

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

29
задан Andrew 21 June 2010 в 16:45
поделиться

1 ответ

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

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

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

28
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: