Миграция с SVN на Git

Недавно я работал над проектом миграции, который включал перенос нашей кодовой базы из SVN в GitHub. После нескольких проб и ошибок и множества часов поиска в Интернете лучших практик мне наконец удалось разработать систему, которая не вызвала никаких слез во время процесса, и я подумал, что было бы неплохо поделиться ею с вами.

Я разбил этот процесс миграции на 4 простых шага:

  1. Подготовьте свою среду
  2. Преобразуйте свой репозиторий SVN в локальный репозиторий git
  3. Преобразование любых больших файлов в объекты lfs (при необходимости)
  4. Отправьте новый репозиторий git на GitHub.

На вашем локальном компьютере создайте папку GitMigration, в которой будет размещаться ваш новый репозиторий git: mkdir -p ~/GitMigration

В другой командной строке обновите репозиторий SVN, чтобы убедиться, что у вас установлены последние версии. Также было бы разумно сообщить вашей команде, что вы начинаете миграцию, чтобы больше не было разрешено отправлять коммиты в SVN, пока процесс миграции не будет завершен.

Как только это будет сделано, вам нужно будет создать файл author.txt. Это сопоставит имена пользователей SVN с нужными именами пользователей Git в следующем формате:

jdoe = John Doe <john.doe@gmail.com>
esmith = Emma Smith <emma.smith@gmail.com>

Если вы не хотите находить всех авторов в SVN вручную, вы можете извлечь данные из репозитория SVN с помощью следующей команды, просто убедитесь, что окончательный формат соответствует той же структуре, что и выше:

svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

Если вы хотите перенести коммиты только за определенный период времени, вам нужно будет найти номер версии в репозитории SVN. Для этого выполните следующую команду в папке репозитория svn:

svn log -r {YYYY-DD-MM}:HEAD --limit 1

В папке GitMigration выполните следующую команду:

git svn clone <svn-repo>/<project> <git-repo-name> --authors-file=authors.txt -r <revision-number>:HEAD

Где <svn-repo> это URI репозитория SVN, который вы хотите перенести, <проект> имя проекта, который вы хотите импортировать, <номер ревизии> это номер версии, с которой вы хотите выполнить миграцию (при необходимости), и <git-repo-имя> — это имя каталога нового репозитория Git. Этот процесс может занять некоторое время, в зависимости от размера коммитов SVN.

Теперь идет очистка, перемещение тегов и любых удаленных ссылок в локальные ветки. Чтобы переместить теги в правильные теги Git, выполните следующее в каталоге репозитория git:

for t in $(git for-each-ref --format="%(refname:short)" refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done

Затем переместите все ссылки в refs/remote и превратите их в локальные ветки.

for b in $(git for-each-ref --format="%(refname:short)" refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done; for p in $(git for-each-ref --format="%(refname:short)" | grep @); do git branch -D $p; done;

GitHub имеет ограничение на размер файла в 100 МБ, все, что превышает этот размер, не будет отправлено на GitHub. Это где Git Хранилище больших файлов (LFS) Git LFS заменяет любые большие файлы текстовыми указателями внутри Git, сохраняя содержимое файла на удаленном сервере. Есть много преимуществ использования LFS, таких как

  • Управление версиями больших файлов
  • Больше места в репозитории
  • Более быстрое клонирование и извлечение
  • Тот же рабочий процесс Git
  • Те же элементы управления доступом и разрешения

Чтобы узнать, сколько файлов превышает ограничение в 100 МБ, выполните следующую команду:

git lfs migrate info --everything --above=99MB

это распечатает информацию о различных типах файлов в вашем репо, размер которых превышает отметку 99 МБ (как показано ниже). git_lfs.jpgЧтобы преобразовать файлы в файловые объекты LFS, выполните следующую команду.

git lfs migrate import --everything --above=99MB

Это перепишет историю репозитория git, содержащего любые файлы размером более 99 МБ, и преобразует их в объекты LSF.

Последний шаг — добавить удаленный сервер git и отправить изменения.

git remote add origin git@my-git-server:myrepository.git

git push origin --all;

git push origin --tags;

Вот и все! Поздравляем, вы перенесли репозиторий SVN в Git. Следующим шагом будет информирование вашей команды о завершении миграции и предоставление им доступа к новому удаленному серверу git.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *