昨年末に公開したプラグイン wp_mail to XMPP は、Git で管理しつつ作ってみました。ひととおりできたところで GitHub に公開。それから公式リポジトリを申請して、こちらは SVN なので、git-svn で送ろうとしてもなんだかうまくいかず、とりあえず手動で(ローカルの別の場所にコピーして、svn
で。つまり Git とは完全に切り離して)作業しました。
それからゆっくり見なおしてみました。
「WordPress公式プラグインリポジトリに登録しているプラグインをGitHubで管理する」や「公式リポジトリのWordPressプラグインをGitHubでバージョン管理できる『wp-plugin-in-github』使ってみたよ」を見て、これは便利そうだと思ったのですが、tai さんと同じく readme と本体のバージョンが合わないエラーとか、
- 手元で、勉強がてら git flow を導入していたので、そのままでは構成が合わない
- 翻訳ファイルの作業は自前の Makefile と重複する
など、そのままでは使えませんでした。そこでその中身を個々にやるような形ですが、次のようにやってみました。参考にしたページは
- 「GitHubにホストしていたレポジトリをWordPress.orgのSVNにSourceTree(Mac)を使ってプッシュするまで」
- 「Using Git (and GitHub) with Subversion Mirroring for WordPress Plugin Development」
です。
手順
出発点は
- 既に公式リポジトリに何らかがある状態
- 公式リポジトリの branches は使っていない
- 手元では git-svn がインストールされている状態
という中途半端なところなので、どれほど意味があるのかわかりませんが、自分のメモとして。そのため、例とするプラグインは wp_mail to XMPP です。
公式リポジトリと連携
まず、trac で見るなどして、はじめと終わりのリビジョン番号を調べておきます。
それと、内容が
mako09 = Mako N <mako@pasero.net> plugin-master = Mako N <mako@pasero.net>
というファイル(名前は何でもいいですが、ここではauthor.txt
とします)を作っておきます。
次に、ローカルの何もない場所で、
git svn clone --no-minimize-url -s -A author.txt -r829275:829448 http://plugins.svn.wordpress.org/wp-mail2xmpp/
を行います。-r(はじめ):(終わり)を付けます。この -r ではじめと終わりを指定すれば膨大な時間がかかることもありません。-r(はじめ) だけでは、はじめのリビジョンは申請によって向こうで(plugin-masterに)場所だけ作ってもらったものなので、空っぽのディレクトリだけになります。
手元で作業していた git リポジトリで、このコマンドを実行してもうまくいきませんでした。これ自体はうまくいっているように見えるのですが、後段の git svn rebase
が “Unable to determine upstream SVN information from working tree history” と言うのです。何もない場所でやるとうまくいきます。
git の設定
git config user.name
などの設定を行います。git flow を使うため、
git flow init
も行います。
ブランチの作成
git checkout -b svn
で、svn という名前のブランチを作ります。
svn → 公式、master → gitHub で、develop は手元、という構成です。svn と master の違いは、今回の例では公式には置かないファイル(Makefile, LINGUAS)だけです。
git svn fetch git svn rebase
で、同期させておきます。
ローカルから取り込み
既に作業していたローカルのリポジトリから
git checkout master git remote add temp file:///... git pull temp master
git checkout develop git pull temp develop git remote remove temp
で、取り込みます。
GitHub との連携
git checkout master git remote add origin git@github.com:mako09/wp-mail2xmpp.git
として、
git pull origin master
で、同期させておきます。GitHub には何もなくてこれからという場合は、むしろ git push
することになります。
以上で、GitHub とも公式リポジトリとも連携した git リポジトリが手元に出来ました。これまで作業してきた手元の git リポジトリは不要になります。
その先に作業してきた git リポジトリに、git-svn で svn リポジトリを連携させることができればよかったのですが、上述したようにうまくいきませんでした。このへんの仕組みはよく理解できていません。そのため、このようなとてもまわりくどい手順になってしまいました。
以後の作業
以後は、手元の git リポジトリで作業します。master が完成したら(git checkout master
の状態)、GitHub に送ります。以下、まだその場面ではないので十分試していませんが、
git push # GitHub に送られる
続いて、ブランチ svn に移って、svn に送ります。
git checkout svn git merge master # --squash をつけるか、merge ではなく個々のファイルを checkout のほうがいいかも git svn fetch # 念のため git svn rebase git svn dcommit #公式リポジトリに送られる
git のタグは(ブランチ master で)
git tag 0.9
のようにします。これを GitHub に送るには
git push origin 0.9
です。
svn にタグをつけるのは(ブランチ svn で)
git svn tag 0.9
のようにします。メッセージは自動的に “Create tag 0.9” のようになります。このコマンドで公式側にタブができます。