Как я пришел к 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 > .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