Как я могу получить доступ к svn-веткам, используя git-svn с нестандартным расположением репозитория svn? - PullRequest
4 голосов
/ 10 сентября 2010

Стандартная схема репо в SVN выглядит следующим образом.

/trunk
/branches
    featureX
    featureY
/tags
    1.0
    2.0

Репозиторий, с которым я работаю, имеет более плоскую структуру.

trunk
featureX
featureY

По сути, ствол находится на том же уровне, что и другие ветви. Из-за этого я не могу использовать опцию -s или -b с git svn init.

Как бы я вставил trunk как ветку git master и вставил featureX как ветку git с тем же именем? Мне нет дела до других веток или тегов.

Я видел похожие вопросы, и люди предлагали реструктурировать svn-репозиторий. Это не относится к вопросу, что касается этого вопроса.

Ответы [ 2 ]

3 голосов
/ 11 сентября 2010

Я нашел способ извлечь несколько веток из произвольной структуры репозитория svn.

Опция -b для git svn init будет работать, только если все ветви сгруппированы в подкаталоге вхранилище, такое как в стандартном макете.Если все ветви, включая ствол, расположены рядом в одной папке, это не сработает.Вы можете извлечь выбранные ветви из репозитория svn, по сути создав несколько «стволов» в вашем репозитории git.

Примите плоскую структуру из вопроса с тремя ответвлениями стволом, featureX и featureY.

  1. Создание экземпляра вашего хранилища git.

    mkdir myproject
    cd myproject
    git svn init url:to/svn/repo -T trunk
    

    Это создаст хранилище git с метаданными svn в файле .git/config.

  2. Откройте файл конфигурации и проверьте метаданные 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 о другой интересующей нас ветке.

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

1 голос
/ 10 сентября 2010

Как показано в этой статье , вы можете написать правила для запуска инструмента импорта, как svn2git
(у вас есть менее полная версия svn2git здесь )

См. в этих примерах для правил, которые можно переписать, чтобы они соответствовали этим плоским каталогам / ветвям SVN и объявляли их как ветви Git.

...