Миграция нескольких проектов gitlab и svn в один проект gitlab

#git #svn #merge #gitlab #migration

#мерзавец #svn #слияние #gitlab #миграция

Вопрос:

Миссия: миграция 2 проекта svn и 1 проекта git в 1 новый проект git. (Чтобы упростить, давайте назовем проекты как «svn / first», «svn / second» и «git / third». )

Условие: несовместимая структура папок и язык программирования

Проекты язык местоположение целевого проекта примечание
svn / first C .магистраль/ Первый проект
svn / секунда C .trunk/{Целевой проект}/ Интеграция с системой управления базовыми данными C
git / третий C .Пакет проекта /{Целевой проект}/ Интеграция с системой упаковки, включая базу данных

Как я могу красиво мигрировать?

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

К вашему сведению, ход работ на данный момент выглядит следующим образом.

  1. скопируйте историю ‘svn / first’ в родительский каталог.
      $ git svn clone
     
  2. измените каталоги каждого файла на «.Project package/{Целевой проект}/».
      $ git mv
     
  3. объедините последнюю версию ‘svn / first’ с первой версией ‘svn / second’ вручную.
  • Содержимое исходного файла почти такое же, поэтому я изменил расширение файла и немного изменил источник.
       $ git mv
     
  1. Но здесь я борюсь со своим невежеством.. Как я могу постоянно добавлять (добавлять) историю ‘svn / second’ в историю ‘svn / first’.

Насколько я знаю, git может отслеживать работу по переименованию, но svn не может. Но если нет, вы можете сказать мне, как переименовать файл и исправить историю ‘svn / second’ на ‘svn / first’.

(Честно говоря, я бы предпочел чувствовать себя непринужденно, если бы это было просто невозможно. )

Ответ №1:

я бы разделил эту миграцию на 2 этапа:

  1. я бы преобразовал все в отдельные репозитории git с их собственным проектом и т. Д., Например
  • git / first
  • git / секунда
  • git / третий
  1. я бы проверил репозиторий, который станет моим основным проектом, который я расширю с другими и интегрирую в него другие. Это можно легко сделать, так как git децентрализован, и у вас может быть несколько пультов дистанционного управления.

    Чтобы добиться этого, сначала проверьте первый репозиторий

      git clone <first url>
     

    затем вы можете добавить дополнительные пульты дистанционного управления

      git remote add second <second url>
     git remote add third <third url>
     

    теперь, допустим, я хочу интегрировать develop ветку, чем я бы проверил все 3 ветки разработки в разные локальные ветки

      git checkout -b develop --track origin/develop
     git checkout -b develop_second --track second/develop
     git checkout -b develop_third --track third/develop
     

    После этого я могу перейти к каждой из ветвей разработки, применить свои изменения, например, переместить и т. Д. Зафиксировать их локально и объединить в мою ветку разработки.

    И последнее, но не менее важное: вам нужно объединить эти ветви вместе. Вы получите сообщение об ошибке, что истории не совпадают, но с --allow-unrelated-histories вами вы можете превзойти это.

       git switch develop
      git merge develop_second --allow-unrelated-histories
      git merge develop_third --allow-unrelated-histories
     

    Таким образом, вы также переносите историю Git всех трех репозиториев в выбранной ветке.

Я надеюсь, что это вам как-то поможет, облегчит вашу миграцию и решит вашу проблему. По крайней мере, именно так я бы решал эту проблему или уже решал ее несколько раз.

Комментарии:

1. Это звучит как клише, но я действительно благодарен. Как вы и советовали, 1. Клонировал все три проекта svn и git в три отдельных проекта git. 2. Оставлена только ОСНОВНАЯ ПАПКА, которая должна контролироваться версиями. 3. Подготовил проект git / first C для слияния с проектом git / second C . 4. Перенесите все проекты один за другим, используя опции <—allow-unrelated-history> и плюс <-Xignore-space-at-eol> . Это кажется немного неэффективным, но важно то, что.. Я сделал это! Еще раз, большое вам спасибо.

2. пожалуйста, не забудьте принять ответ 🙂 если это действительно помогло вам