Posted at

Git のサブモジュールってどんなもの?

More than 3 years have passed since last update.

いろんなサイトを見てもピンとこなかったので、検証して自分なりにまとめてみました。

間違いなどあればご指摘いただけるとありがたいです。


サブモジュールとは?

「特定のリポジトリ」「特定のコミット」をリポジトリ内の特定のディレクトリに紐付ける仕組みです。

そのため、以下のように普段のリポジトリ操作の挙動とは異なる点が多々あります。


  • サブモジュール内は独立したリポジトリになっている。

  • サブモジュールを更新するとバージョン管理外のファイルが全て消えてしまう。

  • サブモジュール更新直後はブランチがない状態(no branch)になる。

  • サブモジュールを追加したリポジトリ内でプッシュ、プルなどの操作を行っても、サブモジュールにはその操作が反映されない。

もしサブモジュールを扱うのであれば、これらの挙動の違いは把握しておく必要があります。


TortoiseGit でサブモジュールを操作する


サブモジュールを追加するには?

以下の手順でサブモジュールを追加できます。


  1. 「右クリック > TortoiseGit > サブモジュールの追加」を選択します。

  2. 「リポジトリ」には、サブモジュールとして追加したいリモートリポジトリのアドレスを、

    「パス」にはサブモジュールを入れるフォルダのパスを入力します。

    また、任意のブランチを指定したい場合は「ブランチ」にチェックを入れ、ブランチ名を入力します。



    入力が完了したら、「OK」を押します。

  3. 先ほどの「パス」で指定したディレクトリと、.gitsubmodule というファイルが追加されるので、それらをコミット、プッシュします。


サブモジュールを更新にするには?

サブモジュールを最新の状態にしたい場合、もしくはクローン直後でサブモジュールが空の場合は以下の手順でサブモジュールを更新します。


  1. 「右クリック > TortoiseGit > サブモジュールのアップデート」を選択します。

  2. 更新したいサブモジュールとオプションを選択して、「OK」を押します。

    その際、「リモート追跡ブランチ」のチェックのあり/なしでサブモジュールの中身が以下のように変化します。



    「チェックなし」:サブモジュールを作った時のコミットになる。

    「チェックあり」:最新コミットになる。


更新後は no branch 状態になるので、サブモジュールのリモートリポジトリに対して操作を行いたい場合は任意のブランチに切り替える必要があります。


クローン時にサブモジュールを更新するには?

クローンする際、「再帰的」にチェックを入れると、紐付けられているサブモジュールの更新をクローン処理中に行います。

ただし、ここで行われる更新は「サブモジュールを作った時のコミットにする」だけですので、最新コミットにしたい場合は別途サブモジュールの更新を行う必要があります。


サブモジュールを削除するには?

TortoiseGit では削除ができないので、git と同じ手順で削除します。


  1. .gitsubmodule から削除したいモジュールの情報を削除する。

  2. .git/config から削除したいモジュールの情報を削除する。

  3. コマンドラインや bash から git rm --cache [サブモジュールのディレクトリパス] を実行して、サブモジュールのディレクトリを削除し、コミット、プッシュする。


サブモジュールのリポジトリに対して操作を行うには?

コミット、プル、プッシュ、ブランチの切り替えなど、普段行っているリポジトリ操作をサブモジュールのリポジトリに対して行うには、以下のようにします。


  • サブモジュールフォルダを選択した状態で「右クリック > TortoiseGit」

  • サブモジュールフォルダ以下の階層を開いた状態で「右クリック > TortoiseGit」

逆に、以下のリポジトリ操作を行っても、サブモジュールのリモートリポジトリには一切影響を与えません。


  • サブモジュールフォルダ以外を選択している状態で「右クリック > TortoiseGit」

  • サブモジュールフォルダ外の階層を開いた状態で「右クリック > TortoiseGit」


参考サイト