Я нашел способ извлечь несколько веток из произвольной структуры репозитория 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-репозитория в соответствии со стандартной компоновкой.