Давайте предположим, что ваш плагин уже размещен в официальном SVN репозитории плагинов WordPress, а для примера возьмём популярный плагин Easy Digital Downloads.
Подготовка к работе
1. Во-первых, для начала нам потребуется получить номер ревизии первого коммита в WordPress репозитории для нашего плагина, чтобы не заставлять Git перебирать все 100500 коммитов для поиска нужного:
svn log http://plugins.svn.wordpress.org/easy-digital-downloads/
После выполнения данной команды мы увидим нужный нам номер ревизии:
------------------------------------------------------------------------ r529177 | plugin-master | 2012-04-09 19:36:16 +0200 (Mon, 09 Apr 2012) | 1 line adding easy-digital-downloads by mordauk ------------------------------------------------------------------------
В данном кейсе — это r529177
. Вы также можете найти номер первой ревизии в официальном трек-браузере WordPress.
2. Теперь создаём локальный Git репозиторий и импортируем в него первый коммит из SVN репозитория:
git svn clone --no-minimize-url -s -r529177 http://plugins.svn.wordpress.org/easy-digital-downloads/
Вы должны увидеть примерно следующее:
Initialized empty Git repository in /Users/kaspars/svn2git/easy-digital-downloads/.git/ r529177 = e18c66d09d77e4d8a923f2f300f73606791071e1 (refs/remotes/trunk) Checked out HEAD: http://plugins.svn.wordpress.org/easy-digital-downloads/trunk r529177
Флаг --no-minimize-url
нужен, чтобы запретить git svn clone
выйти в родительскую директорию SVN в репозитории, где лежат абсолютно все плагины, а флаг -s
— чтобы использовать короткие относительные пути.
Курите маны по git-svn.
3. Наконец, перемещаемся в только что созданный Git репозиторий:
cd easy-digital-downloads
и подтягиваем остальные коммиты из SVN репозитория:
git svn fetch
Эта процедура может длится несколько часов! Чтобы быть в курсе того, что происходит на фоне используйте переменную окружения GIT_TRACE
перед командой:
GIT_TRACE=1 git svn fetch
Чтобы ускорить git svn fetch
при работе с большими репозиториями SVN, вы можете попробовать установить параметр --log-window-size
для запроса большего количества коммитов на один SVN запрос (пруф).
Увеличив его до 10000 должно значительно уменьшить время выборки:
git svn fetch --log-window-size 10000
После завершения этого процесса у вас будет полное дерево коммитов Git проекта.
Последний шаг — переместить SVN HEAD
(файлы из SVN /trunk) в git master
:
git svn rebase
Теперь вы должны увидеть все последние файлы плагина в вашем локальном репозитории.
Проверка нового репозитория
Давайте рассмотрим все ветки, которые были созданы:
$ git branch -a
Эта команда вернёт нам список всех доступных веток:
* master remotes/tags/1.0.1.1 remotes/tags/1.0.1.2 remotes/tags/1.0.1.3 remotes/tags/1.0.1.4 ... remotes/tags/1.1.8 remotes/tags/1.2 remotes/tags/1.2.1 remotes/tags/1.2.1.1 remotes/trunk
А внутри конфига .git/config
новой репы:
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = false [svn-remote "svn"] url = http://plugins.svn.wordpress.org/easy-digital-downloads fetch = trunk:refs/remotes/trunk branches = branches/*:refs/remotes/* tags = tags/*:refs/remotes/tags/*
Мы видим, что git автоматически выбрал trunk
в качестве места назначения для git svn dcommit
, который пушит все ваши изменения в Git обратно в репозиторий SVN.
Добавление удалённого Git репозитория
Давайте создадим новый репозиторий GitHub, который будем использовать в качестве основного репозитория для разработки наших плагинов:
После того, как вы создали репозиторий, просто добавьте его в качестве удаленного источника нашего локального репозитория Git:
git remote add origin git@github.com:kasparsd/wordpress-svn2git-sample.git
И запушьте наш локальный репозиторий на GitHub:
git push origin --all
Теперь ваш репозиторий на GitHub содержит все файлы плагина, а также всю историю ревизий, перенесенную из репозитория Subversion.
Работа с плагином
Теперь предположим, что мы хотим создать новую версию плагина, чтобы пригласить пользователей сообщать об ошибках и участвовать в GitHub. Для этого мы отредактируем копию файла readme.txt и увеличим версию плагина.
После внесения изменений мы можем проверить состояние нашего локального репозитория Git:
git status # On branch master # Changes not staged for commit: # (use "git add «file»..." to update what will be committed) # (use "git checkout -- «file»..." to discard changes in working directory) # # modified: easy-digital-downloads.php # modified: readme.txt # no changes added to commit (use "git add" and/or "git commit -a")
Зафиксируем изменения в локальном репозитории:
git commit -am "Adding message about moving to GitHub, version bump"
Пушим наши правки на GitHub
Для публикации наших локальных коммитом на GitHub мы используем:
git push [master addb6cf] Adding message about moving to GitHub, version bump 2 files changed, 12 insertions(+), 1112 deletions(-) rewrite readme.txt (99%)
Пушим наши правки в SVN репозиторий
После перехода на использование Git в качестве системы управления версиями всегда следует использовать git svn dcommit
для публикации изменений в репозитории SVN. В противном случае необходимо выполнить:
git svn rebase
Каждый раз перед пушем изменений в SVN нужно слить изменения из репозитория SVN в локальный репозиторий Git.
Если вы НЕ используете trunk
в качестве релизной ветки вашего плагина, то можете безопасно перенести все изменения из Git в репозиторий WordPress, не беспокоясь о том, что пользователи получат уведомления об обновлении:
git svn dcommit
Теперь, поскольку у меня нет доступа на запись в этот конкретный репозиторий, вот ответ, который я получаю при пуше одного из моих собственных плагинов:
Committing to http://plugins.svn.wordpress.org/widget-context/trunk ... M widget-context.php Committed r601084 M widget-context.php r601084 = a1c2a2f8f4f98ec5537aef48545e350ff6270f2b (refs/remotes/trunk) No changes between b6098f5bb1751cc05309093cad1d5d982a964158 and refs/remotes/trunk Resetting to the latest refs/remotes/trunk
Тегирование релизов
Тегирование релиза в Git выглядит совсем просто:
git tag v1.0.2
Для создания тега в SVN:
git svn tag 1.0.2
Это создаст /tags/1.0.2
в удаленном репозитории SVN и скопирует все файлы из удаленного /trunk
в этот тег, поэтому перед созданием тега SVN обязательно запушьте весь последний код в /trunk
.
Обновление и отслеживание ресурсов плагина
Папка assets в репозитории WordPress используется для хранения баннеров и скриншотов плагина. Убедитесь, что папка /assets
действительно существует в SVN, прежде чем пытаться получить ее. Для этого откройте в вашем браузере:
http://plugins.svn.wordpress.org/easy-digital-downloads/
где easy-digital-downloads
— это ярлык вашего плагина, и вы должны увидеть корневую папку вашего плагина в репозитории SVN :
Revision 851441: /easy-digital-downloads .. 1.0.4/ assets/ branches/ tags/ trunk/
Обратите внимание, что папка /assets
присутствует в листинге.
Давайте будем отслеживать эту папку как отдельную ветку Git под названием assets
. Каждый раз, когда вам нужно обновить изображение обложки или скриншоты, просто извлеките эту ветку, внесите изменения и опубликуйте ее в SVN, используя тот же git svn dcommit
.
Добавляем новый удаленный SVN с именем assets
:
git config --add svn-remote.assets.url http://plugins.svn.wordpress.org/easy-digital-downloads/assets
И говорим Git юзать ветку assets
в нашем удаленном репозитории SVN:
git config --add svn-remote.assets.fetch :refs/remotes/assets
После выполнения данной команды в наш конфиг .git/config
добавятся следующие строки:
[svn-remote "assets"] url = http://plugins.svn.wordpress.org/easy-digital-downloads/assets fetch = :refs/remotes/assets
Это означает, что теперь мы можем получить assets
из SVN:
git svn fetch -r HEAD assets
и переключиться туда:
git checkout remotes/assets Note: checking out 'remotes/assets'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name HEAD is now at 7e5b727... Updated banner image
Давайте создадим локальную ветку с именем assets
для отслеживания:
git checkout -b assets
Теперь вы можете добавить или изменить ресурсы плагина, зафиксировать изменения и опубликовать их в SVN, используя:
git svn dcommit
Ссылки
Источник: https://www.kobzarev.com/wordpress/wordpress-plugin-github-mirroring/