Миграция с SVN на Git
Недавно я работал над проектом миграции, который включал перенос нашей кодовой базы из SVN в GitHub. После нескольких проб и ошибок и множества часов поиска в Интернете лучших практик мне наконец удалось разработать систему, которая не вызвала никаких слез во время процесса, и я подумал, что было бы неплохо поделиться ею с вами.
Я разбил этот процесс миграции на 4 простых шага:
- Подготовьте свою среду
- Преобразуйте свой репозиторий SVN в локальный репозиторий git
- Преобразование любых больших файлов в объекты lfs (при необходимости)
- Отправьте новый репозиторий 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 МБ (как показано ниже). Чтобы преобразовать файлы в файловые объекты 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.