Так сложилось, что в нашей компании используется SVN для внутренних нужд. Но делать локальные эксперименты, или вообще проверки, бранчевания и т.п. значительно удобнее используя git. Естественно и логично для индивидуальной работы использовать git-svn
. В
статье подробно рассмотрен вопрос экспорта своего нового проекта из git в svn с сохранением истории. Это случай, когда вы делаете локальный проект, отлаживаете его и, по результату, выкладываете в центральный SVN репозиторий.
Подкатом вольный пересказ при использовании стандартного размещения каталогов: ProjectName/{trunk,tags,branches}, для нестандартного - в статье.
# Создаём директорию проекта
$ svn mkdir --parents https://host.domain/svn/some_path/Project/trunk -m "Make project directory."
# В текущем git репозитории делаем:
$ git svn init https://host.domain/svn/some_path/Project -T trunk -t tags -b branches --prefix=svn/
# стоит отметить, что для стандартного размещения опции -T/-t/-b можно не использовать, а указать:
# -s или --stdlayout, т.е. в примере выше можно было смело написать:
# git svn init https://host.domain/svn/some_path/Project -s --prefix=svn/
# --prefix=svn/ - этот префикс будет добавлен ко всем тегам/бранчам из SVN, удобно что бы не запутаться.
# маппинг логинов svn и авторов в git, выбирать будет ли это глобальной (--global) или локальной
# (--local, для репозитория) - на ваше усмотрение. Мне удобнее глобальное:
$ git config --global svn.authorsfile ~/.git-svn-authors
# внутри ~/.git-svn-authors примерно такое:
# svnlogin = Name SecondName <mail@company.com>
# Теперь получаем данные из svn:
$ git svn fetch
# вывод должен закончится чем-то вроде:
# r4800 = a8a5a003d5b1b331275e29b4fa80748369374287 (refs/remotes/svn/trunk)
# если неправильно заполнили .git-svn-authors, вам об этом скажут, просто поправьте и выполните команду заново.
# Проверьте бранчи, как должен обязательно присутствовать master (если вы его не переименовывали) и
# remotes/svn/trunk (если вы не меняли префикс в git svn clone):
$ git branch -av
* master c3a7161 The latest git commit.
remotes/svn/trunk 3b7fed6 Make project directory.
# видно, что головы отличаются
# Теперь накатим наши изменения выше изменений из репозитория:
$ git rebase svn/trunk
# Ну и теперь можно загрузить всё это в svn:
$ git svn dcommit