Как я могу получить доступ к svn-веткам, используя git-svn с нестандартной версией репозитория svn?
Стандартная схема репо в SVN выглядит следующим образом.
/trunk
/branches
featureX
featureY
/tags
1.0
2.0
Репозиторий, с которым я работаю, является гораздо более плоской структурой.
trunk
featureX
featureY
По сути, ствол находится на том же уровне, что и другие ветви. Я не могу использовать опцию -s или -b с git svn init
из-за этого.
Как бы я потянул в trunk
как ветка мерзавца master
и тянуть в featureX
как одноименная ветка git? Мне нет дела до каких-либо других веток или тегов.
Я видел похожие вопросы, и люди предложили реструктурировать хранилище SVN. Это не обсуждается, поскольку этот вопрос касается.
2 ответа
Я нашел способ извлечь несколько веток из произвольной структуры репозитория SVN.
-b
вариант для git svn init
будет работать только в том случае, если все ветви сгруппированы в подкаталоге в хранилище, например, в стандартном макете. Если все ветви, включая ствол, расположены рядом в одной папке, это не будет работать. Вы можете извлекать выбранные ветви из репозитория svn, создавая по существу несколько "стволов" в вашем репозитории git.
Предположим, плоская структура из вопроса с тремя ветвями ствола, FeatureX и FeatureY.
Создайте свой репозиторий git.
mkdir myproject cd myproject git svn init url:to/svn/repo -T trunk
Это создаст Git-репозиторий с метаданными SVN в
.git/config
файл.Откройте файл конфигурации и проверьте метаданные SVN
vim .git/config
Ваш конфигурационный файл будет выглядеть примерно так.
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true autocrlf = false [svn-remote "svn"] url = url:to/svn/repo fetch = trunk:refs/remotes/trunk
svn-remote
заголовок определяет ссылку под названием "svn", указывающую на ваш репозиторий svn.fetch
Параметр указывает git-svn, где можно получить новые ревизии из хранилища svn. Теперь нам нужно рассказать git-svn о другой ветке, которая нас интересует.Дублируйте
svn-remote
разделСкопируйте весь
svn-remote
раздел файла конфигурации и вставьте его под существующим текстом конфигурации.[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true autocrlf = false [svn-remote "svn"] url = url:to/svn/repo fetch = trunk:refs/remotes/trunk [svn-remote "svn"] url = url:to/svn/repo fetch = trunk:refs/remotes/trunk
Изменить новый
svn-remote
разделИзменить имя
svn-remote
заголовок раздела и название ветви, на которую он указывает.[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true autocrlf = false [svn-remote "svn"] url = url:to/svn/repo fetch = trunk:refs/remotes/trunk [svn-remote "svn-featureX"] url = url:to/svn/repo fetch = featureX:refs/remotes/featureX
Теперь git-svn будет отслеживать обе ветви svn. Вы можете использовать имена "svn" и "svn-featureX" с любой командой git-svn, которая принимает
[svn-remote]
параметр. Вы можете использовать имена "trunk" и "featureX" с любой командой git, которая принимает имя удаленной ветви в качестве параметра.
Это решение не очень хорошо масштабируется, и это немного хакер для работы с некорректным хранилищем SVN. Пока вам нужно только отслеживать несколько веток svn, это будет работать просто отлично. Если количество веток svn, с которыми вам нужно работать, становится слишком большим, серьезно отнеситесь к реструктуризации вашего svn-репозитория в соответствии со стандартной компоновкой.
Как показано в этой статье, вы можете написать правила для запуска инструмента импорта, такого как svn2git
(у вас есть менее полная версия svn2git здесь)
Посмотрите эти примеры для правил, которые вы могли бы переписать, чтобы соответствовать этим плоским SVN-каталогам / ветвям и объявить их как ветви Git.