Обложка к записи Зеркалируем WordPress плагин на GitHub
Время для прочтения: 2 мин. 25 сек.

Зеркалируем WordPress плагин на GitHub

Давайте предположим, что ваш плагин уже размещен в официальном 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

Ссылки

Пошерить
Запинить
Отправить
Вотсап

Смотрите также

Комментарии