Миграция с svn на git с сохранением истории

git Как я пришел к git? Всегда на своих проектах в качестве системы контроля версий использовал svn(subversion). Благо разработкой проектов я занимаюсь один и в большинстве случаев к использованию веток  прибегать не приходилось, но уж если приходилось, то в большинстве случаев это был для меня кошмар. По рекомендациям многих знакомых и по отзывам в интернете решил попробовать что-то новое, например, git. Попробовал, понравилось, теперь использую. И конечно задался вопросом как перевести на git все свои старые проекты. Делюсь рецептом как делал это я.

1.  Делаем checkout нашего репозитария, для проекта project:

$ svn co [SVN repo URL]

в моем случае [SVN repo URL] это file:///usr/local/repo/project/

2. Получаем список всех коммитеров в файл authors-transform.txt.

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

В полученном файле строки будут иметь примерно следующий формат:

jwilkins = jwilkins

их надо преобразовать примерно в следующий вид:

jwilkins = Vasya Pupkin <vasya_pupkin@example.com>

3. Клонируем с помощью git-svn наш subversion репозитарий с использованием ранее созданного файла authors-transform.txt.
Если у вас использовалась стандартная структура репозитария с директориями trunk/branches/tags, то выполняем следующую команду:

$ git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Но у меня все репозитарии были без этих директорий, поэтому выполняем команду:

$ git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt ~/temp

4. Конвертируем svn:ignore в .gitignore

$ cd ~/temp
$ git svn show-ignore &gt; .gitignore
$ git add .gitignore
$ git commit -m 'Convert svn:ignore properties to .gitignore.'

5. Переносим в фиктивный git репозитарий.
С начала создадим новый git репозитарий:

$ git init --bare ~/new-bare.git
$ cd ~/new-bare.git
$ git symbolic-ref HEAD refs/heads/trunk

далее сделаем push в созданный репозитарий:

$ cd ~/temp
$ git remote add bare ~/new-bare.git
$ git config remote.bare.push 'refs/remotes/*:refs/heads/*'
$ git push bare

6. Переименовываем ветку «trunk» в «master»
Если была стандартная архитектура репозитария(trunk/branches/tags), то делаем:

$ cd ~/new-bare.git
$ git branch -m trunk master

Иначе как в моем случае(переименовываем ветку «svn-git» в «master»), делаем:

$ cd ~/new-bare.git
$ git branch -m svn-git master

7. Отчищаем branches и tags

$ cd ~/new-bare.git
$ git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

начиная с «git for-each-ref …» и до «…done» идет сложная команда состоящая из нескольких строк.

8. Теперь у нас есть нужный нам git репозитарий с сохранением всей истории коммитов. Можно еще его добавить на bitbucket, что я и сделал.
Заходим на bitbucket и создаем новый репозитарий project, далее:

$ cd ~/new-bare.git
$ git remote add origin https://username@bitbucket.org/username/project.git
$ git push -u origin --all
$ git push -u origin --tags

Основой для статьи послужила статья Converting a Subversion repository to Git

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.