пятница, 29 ноября 2013 г.

Включение git-репозитория в svn-проект как svn:externals

Несмотря на то, что в своей работе я предпочитаю использовать распределённые системы контроля версий ( git / hg ), но переодически приходится работать в командах, использующих svn.

Итак, потребовалось, в svn-проекте использовать библиотеки, написанные другой ( дружественной командой ), но которые лежат в git репозитории.

После поиска в интернете решил сделать скриптового бота, для которого инициализирую git-svn репозиторий. Дальше робот будет опрашивать git - репозиторий, и при наличии изменений заливать их в svn - репозиторий.



Создаём папку для робота.

mkdir ~/sync_robot
cd ~/sync_robot

Далее необходимо создать и инициализировать svn-репозиторий, куда робот будет зеркалить git-репозиторий.
Пример создания svn-репозитория на linux-сервере можно посмотреть тут.
заливаем себе на машину svn-репозиторий.

svn co <svn url > svnrepo
cd svnrepo

Далее в этот "пустой" репозиторий необходимо сделать хотя бы 1 коммит, иначе, при попытке коммитить в этот репозиторий через git-svn будете получать ошибку
Unable to determine upstream SVN information from working tree history

Я делал так, брал какой-либо текстовый файл из git-репозитория, добавлял в svn-репозиторий и коммитил.

cp <git_project_path>/text_file.txt $(pwd)
svn add text_file.txt
svn commit

После этого удаляем папку svn-репозитория, т.к. роботу она более не нужна

cd ..
rm -rf svnrepo

Приступаем к созданию "рабочей папки" для робота
**Пользователь, из-под которого будет работать робот, должен предварительно добавить свой ssh_publick_key на git-сервер, что бы иметь возможность выполнять команду git pull origin master без необходимости ввода пароля

git svn clone < svn url > <project>
cd <project>
git remote add origin < git url >
git pull origin master
git svn dcommit

Cкрипт синхронизации (sync_robot/syncrobot.sh) выглядит так
#!/bin/sh
#==========================================
# before start init repo from origin and add mirror
# git add remote mirror <url_githubrepo>
#
# for autostart add to /etc/rc.local
# (note: username=<authorized_user>)
# su -l <authorized_user> -c "nohup '/home/<authorized_user>/sync_robot/syncrobot.sh' &"
repodir="/home/<authorized_user>/sync_robot/<project>"
# main loop
while :
do
  cd $repodir1
  git pull origin master
  git svn dcommit
  cd -
  sleep 60; # every minute
done
#==========================================

Для автоматического запуска скрипта я добавил его в /ect/rc.local ( как и указано в комментариях скрипта ).

Можно после этого перезагрузить машину робота, или самому запустить скрипт.

Далее добавляем svn-зеркало как svn:externals к целевому проекту.
Например так:

svn propset svn:externals '<local_path_to_git_code> <svn_mirror_url>' .
svn commit
svn up

На этом у меня всё.

Если есть более элегантные способы решить указанную задачу, то буду рад узнать о них =)


Комментариев нет:

Отправить комментарий