Как я могу получить доступ к 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.

  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-репозитория в соответствии со стандартной компоновкой.

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

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

Другие вопросы по тегам