TowerでGitのsubmoduleを扱う


submoduleは、別リポジトリの内容をサブディレクトリとして扱うようにできるGitの機能です。ここではGitクライアント「Tower」でのsubmoduleの扱い方について記載します。

使用したバージョン

  • Tower 2.3.3
  • Mac OS X El Capitan バージョン 10.11.2

submoduleを追加する

submoduleを追加するには、メニューの[Repository]→[Add New Submodule...]を選択します。

メニューから選択後、以下のダイアログが表示されます。[Path]、[Repository URL]に、それぞれsubmoduleを配置するサブディレクトリー、リポジトリのURLを入れます。

submodule内のファイルを変更する

左側ペインの[Submodules]をダブルクリックすると、submodule内を通常のリポジトリとして扱うことができます。ヘッダーにどこのリポジトリのsubmoduleなのか表示されるため、分かりやすいです。ここで通常通りコミットとプッシュを行うことでリポジトリは更新されます。

submodule側でコミットを行うと、親側のリポジトリーで、変更が検知されます。これをコミット&プッシュすることで、親側のリポジトリーのsubmoduleの取り込み先ハッシュ値が更新されます。

リモートのリポジトリ―にsubmoduleがある場合

cloneするとき

clone時に[Initialize Submodule]にチェックを入れておくと、自動でsubmoduleの中身の取り込みがされます。チェックを入れておかないと、submoduleのディレクトリの中身は空になっています。チェックを入れていない場合のsubmoduleの中身を取り込み方は後述で説明します。

pullする

リモート上のリポジトリのsubmoduleハッシュ値が更新されている状態で、pullを行うと以下のダイアログが表示されます。

[Update]ボタンを押すと、submoduleの更新が取り込まれます。自分がsubmodule内のファイルを更新することがなければ、[Always auto-update submodule]にチェックを入れておいて大丈夫だと思います。(作業する場合だとコンフリクトする可能性があります)

submoduleの内容を取り込む

clone時に[Initialize Submodule]にチェックを入れておかなかったり、pull時に[Update]を選択していない状態だと、submoduleの中身が空のままだったり、古いままになります。左側パネルの[Submodules]を選択した時に黄色い帯で「Submodule is uninitialized. Use "Update" to Initialize now.」とのメッセージと[Update]ボタンが表示されるので、[Update]ボタンをクリックすることで、submoduleのディレクトリの中身が取り込まれます。

具体的な事例

Webサイト「HTML5製のデザインツール Particle Develop - ICS」の開発で、submoduleを使用しました。パーティクルエディター内ではパーティクルシステムをsubmoduleとして扱うことで、パーティクルシステムのランタイムを単体で提供できるようになりました。