Gitでサブモジュール

何ができるか?

外部の gitリポジトリを、自分の gitリポジトリのサブディレクトリとして登録し、特定のコミットを参照できる。ライブラリなどを参照する場合に便利である。

サブモジュールを登録する

自分の gitリポジトリで、ターミナルから下記のようなコマンドを実行する。

git submodule add [サブモジュールのリポジトリURL] [サブモジュールのディレクトリ]

例えば、GitHubにある https://github.com/lipoyang/SPI_NeoPixel というライブラリを、自分のリポジトリ内の SPI_NeoPixel というサブディレクトリに登録したい場合は下記のコマンドを実行する。

git submodule add https://github.com/lipoyang/SPI_NeoPixel.git SPI_NeoPixel

自分のリポジトリGitHubにプッシュした場合、サブモジュールは下記のように表示される。
@以降の16進数が、参照しているコミットのID(の先頭7桁)である。

サブモジュールのコミットIDは下記のコマンドで確認できる。

git submodule status
 6837425f1c7afb3c83373b4b84eb9b43be79ba5a SPI_NeoPixel (heads/main)

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

下記の要領で削除できる。

git submodule deinit SPI_NeoPixel
git rm -f SPI_NeoPixel

サブモジュールを含むリポジトリをクローンする

サブモジュールを含むリポジトリをふつうにクローンしても、サブモジュールの中身はクローンされない。
サブモジュールもクローンしたいときは下記のように再帰オプションを指定する。

git clone --recursive [クローンしたいリポジトリ]

SourceTreeを使う場合は、クローンの「詳細オプション」で「サブモジュールに再帰」にチェックする。

ふつうにクローンしてしまった後でサブモジュールをクローンするには下記のコマンドを実行する。

git submodule update --init --recursive

サブモジュールのバージョンを変える

サブモジュールのディレクトリはリポジトリとは別個のgitリポジトリになっている
サブモジュールの操作は、サブモジュールのディレクトリに降りてgitコマンドを実行する。
SourceTreeを使う場合は、左端の欄の「サブモジュール」からサブモジュールのリポジトリを開くことができる。

コミットIDを指定してバージョンを変えるには下記のコマンドを実行する。

git reset --hard [コミットid]

SourceTreeを使う場合は、Historyで所望のコミットを選択して「現在のブランチをこのコミットまでリセット」をクリックし、「使うモード」は「Hard」を選択する。

そのうえで、リポジトリに戻って変更をコミットする

参考