Преобразование из SVN в Git с субмодулями - PullRequest
2 голосов
/ 21 декабря 2010

В настоящее время мы используем Subversion в качестве нашей системы управления версиями, мы решили, что переходим к Git. Мне было трудно переместить мою систему Subversion со стандартной версткой в ​​git. Я использовал git svn столько, сколько смогу.

Что мне нужно сделать, так это конвертировать нашу систему Subversion в Git со всей историей коммитов, а также с тегами и ветвями. Затем, чтобы иметь возможность разделить каждый из проектов в отдельные репозитории git со своей индивидуальной историей, затем объедините каждый из этих отдельных репозиториев в подмодули.

Буду признателен за любые идеи о том, как наиболее легко это сделать.

svnroot/
|-- branches
|-- tags
|-- trunk
    |-- project A
    |-- project B
    `-- project C

Пожалуйста и спасибо

1 Ответ

2 голосов
/ 22 декабря 2010

Если ваш макет хранилища SVN:

svnroot/
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|-- projectB
|   |-- branches
|   |-- tags
|   `-- trunk
`-- projectC
    |-- branches
    |-- tags
    `-- trunk

Тогда вы можете создать отдельные репозитории git для каждого проекта, например, projectA:

$ git svn clone --stdlayout https://svn.example.net/svnroot/projectA

После этого вы можете создать основное git-репо (git init) и добавить созданные git-репо для project{A,B,C} в качестве подмодулей к нему (git submodule).

Но это, вероятно, не то, что вы хотите; из git submodule руководства:

Подмодули допускают зарубежные репозитории быть встроенным в выделенный подкаталог исходного дерева, всегда указывает на конкретный коммит.

Их не следует путать с пультами дистанционного управления, которые в основном предназначены для филиалов одного и того же проекта; субмодули предназначены для разных проекты, которые вы хотели бы сделать частью вашего исходного дерева, а история два проекта по-прежнему остаются полностью независимыми, и вы не можете изменить содержимое подмодуля из основного проекта.

Если вы хотите изменить project{A,B,C} из основного проекта и сохранить историю проектов, то подмодули не подходят для этой задачи.


Для предоставленного макета SVN репо:

svnroot/
|-- branches
|-- tags
|-- trunk
    |-- projectA
    |-- projectB
    `-- projectC

попробуйте создать репозитории git, используя аргументы --trunk, --branches, --tags, например:

$ git svn clone                       \
>    --trunk trunk/projectA           \
>    --branches branches              \
>    --tags  tags                     \
>    https://svn.example.net/svnroot  \
>    projectA

По завершении файл .git/config должен содержать что-то вроде:

[svn-remote "svn"]
        url = https://svn.example.net/svnroot
        fetch = projectA/trunk:refs/remotes/trunk
        branches = branches/*:refs/remotes/*
        tags = tags/*:refs/remotes/tags/*

Вы можете использовать --ignore-paths=<regex>, чтобы пропустить соответствующие пути из проекта.

...