Несмотря на то, что в своей работе я предпочитаю использовать распределённые системы контроля версий ( git / hg ), но переодически приходится работать в командах, использующих svn.
Итак, потребовалось, в svn-проекте использовать библиотеки, написанные другой ( дружественной командой ), но которые лежат в git репозитории.
После поиска в интернете решил сделать скриптового бота, для которого инициализирую git-svn репозиторий. Дальше робот будет опрашивать git - репозиторий, и при наличии изменений заливать их в svn - репозиторий.
Создаём папку для робота.
заливаем себе на машину svn-репозиторий.
Далее в этот "пустой" репозиторий необходимо сделать хотя бы 1 коммит, иначе, при попытке коммитить в этот репозиторий через git-svn будете получать ошибку
На этом у меня всё.
Если есть более элегантные способы решить указанную задачу, то буду рад узнать о них =)
Итак, потребовалось, в svn-проекте использовать библиотеки, написанные другой ( дружественной командой ), но которые лежат в git репозитории.
После поиска в интернете решил сделать скриптового бота, для которого инициализирую git-svn репозиторий. Дальше робот будет опрашивать git - репозиторий, и при наличии изменений заливать их в svn - репозиторий.
Создаём папку для робота.
mkdir ~/sync_robot
cd ~/sync_robot
cd ~/sync_robot
Далее необходимо создать и инициализировать svn-репозиторий, куда робот будет зеркалить git-репозиторий.
Пример создания svn-репозитория на linux-сервере можно посмотреть тут.заливаем себе на машину svn-репозиторий.
svn co <svn url > svnrepo
cd 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 add text_file.txt
svn commit
После этого удаляем папку svn-репозитория, т.к. роботу она более не нужна
cd ..
rm -rf svnrepo
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
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
#==========================================
#==========================================
# 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
svn commit
svn up
На этом у меня всё.
Если есть более элегантные способы решить указанную задачу, то буду рад узнать о них =)
Комментариев нет:
Отправить комментарий