Как перейти от сложного репозитория Subversion к распределенной системе контроля версий?
Вопрос
Предположим, у нас есть репозиторий Subversion, который выглядит так:
/original/0.1
/original/0.2
/variantA/trunk
/variantA/branches/who/branch_for_xxx
/variantA/branches/she/branch_for_yyy
/variantB/trunk
/variantB/branches/who/branch_for_zzz
(... 30 or 40 alike)
где вариант A и вариант B — это версии исходного программного обеспечения.
Я ищу способ переноса этого репозитория в распределенную систему контроля версий:метод
- не обязательно использовать одну команду
- для любой из известных распределенных систем контроля версий
- заставить dvcs думать об этих ветвях:/official/{0.1,0.2} деревья, /variantA/дерево ствола, ...
- информирование dvcs об отношении наследования этих деревьев
Решение
Если вы считаете Гит в качестве возможного кандидата DVCS — сценарий Ruby. svn2git делает то, что вам нужно.
Подробнее в вопросе: Клонирование нестандартного репозитория Svn с помощью Git-Svn
Другие советы
Mercurial поставляется с расширением Convert, которое должно делать то, что вы хотите.См. преобразовать детали расширения на веб-сайте Mercurial.
Для Git см. инструкции по адресу http://github.com/guides/import-from-subversion
В последний раз, когда я делал это вручную, я использовал команды ниже.(Это было для проекта, в котором не использовались теги или ветки.С использованием svn2git может дать лучшие результаты, чем git-svn, если у вас есть теги или ветки.)
cat "mysvnusername = Me Myself <me.myself@somewhere.com>" >> authors.txt
svnserve --daemon --foreground --root <SVN-REPO-PARENT-DIR>
git svn clone --stdlayout --authors-file=authors.txt --no-metadata svn://localhost/<SVN-REPO-NAME>
# push to a public repo and clone from there, to get push/pull working easily
cd <SVN-REPO-NAME>
git remote add origin git@github.com:mygithubusername/<GIT-REPO-NAME>.git
git push origin master
cd ..
rm -rf <SVN-REPO-NAME>
git clone git@github.com:mygithubusername/<GIT-REPO-NAME>.git
Но поскольку у вас нестандартная структура репозитория SVN, вам нужно будет указать параметры --trunk, --tags и --branches вместо --stdlayout для клон git svn.
Чтобы представить всю историю наследования вашего репозитория, вы можете попробовать изменить порядок вашего репозитория так, чтобы вместо нестандартной иерархии у вас была стандартная плоская структура репозитория:
/branches/original-0.1
/branches/original-0.2
/branches/variantA-trunk
/branches/variantA-who-branch_for_xxx
/branches/variantA-she-branch_for_yyy
/branches/variantB-trunk
/branches/variantB-who-branch_for_zzz
...
Это должно облегчить инструментам импорта понимание репозитория.Затем, когда они будут импортированы, вы сможете лучше реорганизовать их внутри нового репозитория.
Кроме того, я слышал, что Git 1.6.x поддерживает глубокое клонирование, так что вы можете git svn clone
такие параметры, как --branches=branches/*/*
который будет глубоко изучать иерархию ветвей.Видеть эта почта для примера его использования.
$ bzr svn-import --layout Trunk1 svn-корневой URL bzr.repo
Должен поступить правильно.Для этого вам необходимо установить плагин bzr-svn.