Как получить доступ к веткам svn с помощью git-svn с нестандартным макетом репозитория svn?

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

/trunk
/branches
    featureX
    featureY
/tags
    1.0
    2.0

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

trunk
featureX
featureY

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

Как мне получить trunk в качестве ветки git master и вытащить featureX в качестве одноименной ветки git? Меня не интересуют другие ветки или теги.

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


person haydenmuhl    schedule 09.09.2010    source источник


Ответы (2)


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

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

Предположим, что плоская структура из вопроса состоит из трех ветвей: trunk, 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 до стандартного макета.

person haydenmuhl    schedule 11.09.2010

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

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

person VonC    schedule 10.09.2010
comment
Примечание. Более свежие репозитории svn2git см. в разделе stackoverflow.com/questions/572893/ - person VonC; 04.11.2010