#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». Если это возможно, я думаю, что последнее было бы проще.
К вашему сведению, ход работ на данный момент выглядит следующим образом.
- скопируйте историю ‘svn / first’ в родительский каталог.
$ git svn clone
- измените каталоги каждого файла на «.Project package/{Целевой проект}/».
$ git mv
- объедините последнюю версию ‘svn / first’ с первой версией ‘svn / second’ вручную.
- Содержимое исходного файла почти такое же, поэтому я изменил расширение файла и немного изменил источник.
$ git mv
- Но здесь я борюсь со своим невежеством.. Как я могу постоянно добавлять (добавлять) историю ‘svn / second’ в историю ‘svn / first’.
Насколько я знаю, git может отслеживать работу по переименованию, но svn не может. Но если нет, вы можете сказать мне, как переименовать файл и исправить историю ‘svn / second’ на ‘svn / first’.
(Честно говоря, я бы предпочел чувствовать себя непринужденно, если бы это было просто невозможно. )
Ответ №1:
я бы разделил эту миграцию на 2 этапа:
- я бы преобразовал все в отдельные репозитории git с их собственным проектом и т. Д., Например
- git / first
- git / секунда
- git / третий
- я бы проверил репозиторий, который станет моим основным проектом, который я расширю с другими и интегрирую в него другие. Это можно легко сделать, так как 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. пожалуйста, не забудьте принять ответ 🙂 если это действительно помогло вам