OpenPNEを使ったカスタマイズ開発プロジェクトをGitで管理する方法

# まだまだGit勉強中なので、あくまで現時点の私のレベルでのメモです。

注意

OpenPNE3ディレクトリ配下だけをカスタマイズプロジェクトとして扱いたいだけであれば、OpenPNE3リポジトリに自分用開発ブランチを作ればよいと思います。

状況とやりたいこと

  • 状況
    • OpenPNE3はGitでソース管理されている(GitHub
    • OpenPNE3の画面などを大きくカスタマイズする場合、コア部分のファイルに手を入れる必要がある
  • やりたいこと
    • OpenPNE3をカスタマイズして使うプロジェクトをGitで管理したい
    • できれば、1つのGitリポジトリで、プログラムコードだけでなく設計ドキュメントなども管理したい
    • OpenPNE3の本体のバージョンアップに(手軽に)追随したい
      • Gitで差分を手軽に適用したい


Gitのサブモジュール(submodule)とサブツリーマージ(subtree merge)のうち、サブツリーマージの方を使うと上手くできそうだということが分かりました。

Gitのサブツリーマージを使ったOpenPNE3プロジェクトの管理

まず、masterブランチでプロジェクト全体の基本構造を作ります。ドキュメント格納用ディレクトリdocsと、プログラム関連格納用ディレクトリprojectsを作成し、仮にデータベース仕様ドキュメントをファイルを作ってコミットします。

$ mkdir prj
$ cd prj
$ git init
$ git mkdir docs projects
$ git touch docs/database_spec.txt
$ git add .
$ git commit -m 'added database_spec'

次に、OpenPNE3のリポジトリをリモートとして登録し、リポジトリデータをフェッチします。フェッチが完了したら、リモートブランチをチェックアウトします。

$ git add remote openpne3 git://github.com/openpne/OpenPNE3.git
$ git fetch openpne3
$ git checkout -b openpne3master openpne3/master

masterブランチに戻り、openpne3masterブランチの内容をサブツリーとしてマージします。

$ git read-tree --prefix=projects/OpenPNE3/ -u openpne3master

この時点で、masterブランチは以下のようになっています。

  • projects/OpenPNE3ディレクトリに、OpenPNE3リポジトリのmasterブランチの内容がコピーされている(.gitは含まない)
  • コピーされた内容がステージングされている

サブツリーマージをコミットします。

$ git commit -m 'merged OpenPNE3 subtree from openpne3master branch'

これで、プロジェクトの基本構造ができあがりました。

OpenPNE3の更新を取得する

OpenPNE3側の更新を取得して開発しているプロジェクトに適用するには、まずopenpne3masterブランチへ移動して、ブランチの内容を更新します。

$ git checkout openpne3master
$ git pull

次にmasterブランチに戻り、openpne3masterブランチの変更をマージします。

$ git checkout master
$ git merge --squash -s subtree --no-commit openpne3master
  • -s subtreeで、マージ戦略にサブツリーを指定しています。
  • --no-commitオプションをつけているのは、マージのコミット前にマージ内容を確認するためです。マージ用にステージングされたファイルを確認できます。
  • --squashオプションをつけているので、OpenPNE3リポジトリ側のコミットログはmasterブランチには取り込まれません。
    • このプロジェクトの場合、OpenPNE3リポジトリの細かなコミットログは本体側の履歴に含める必要はない

OpenPNE3自体の修正をOpenPNE3リポジトリ側へマージする

開発を行っていて、まれにOpenPNE3本体へパッチを送った方がよい修正などがでてきます。
この場合、openpne3masterブランチへ該当する修正を適用します。

★検証中・・・