外部のリポジトリをサブディレクトリとして扱う「git submodule」について

外部のリポジトリをサブディレクトリとして扱う「git submodule」について Git
記事内に広告が含まれています。

開発を進めるにあたって、マークアップ用のリポジトリから開発用のリポジトリに静的なファイルを取り込みたいという場面があり、その際に手動でコピーするのは管理が大変で何か良い方法がないかと探していました。

そこで、git には submodule という仕組みがあることを知ったので、git の submodule についてまとめてみました。

git submodule

git submodule とは?

git submodule とは、他の git リポジトリを、メインの git リポジトリのサブディレクトリとして登録して、特定の commit を参照する仕組みです。

あくまで commit を参照するものなので、サブディレクトリ側で更新があったとしても、親側で明示的に取り込まないと反映されません。

git submodule の使い方

ここからは、git submodule をどのように使えば良いのかについて書いていきます。

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

例えば、メインのリポジトリAがあり、そこにリポジトリBを取り込みたい場合は以下のように、AのサブモジュールとしてBのリポジトリを追加。

#リポジトリA内で下記コマンドを実施
git submodule add [BのURL]

上記コマンドを実行すると、リポジトリ名のディレクトリが作成され、.gitmodule というファイルが作成されます。

ちなみに、.gitmodule ファイルには、サブモジュールのパスと、URL の情報が記載されています。

サブモジュールを追加したら、既にファイルがステージングエリアに上がっているので、commit し、push すると、GitHub のリポジトリ上では、サブモジュールディレクトリの隣にコミットIDが記載されています。

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

サブモジュールに更新があった場合は、下記のコマンドで随時更新を行います。

git submodule update

サブモジュール内のサブモジュールを更新したい場合は、以下のように recursive オプションをつけます。

git submodule update --recursive

サブモジュールを含むリポジトリをcloneする

リポジトリを clone する際に、recursive オプションをつけてあげることでサブモジュールを含むリポジトリを clone することができます。

git clone --recursive [リポジトリURL]

clone 時に recursive オプションをつけなかった場合、サブモジュールを含むディレクトリ自体は取得できますが、その中に何もファイル等は入っていないので、init と update を行う必要があります。

git clone [リポジトリURL]
git submodule init
git submodule update

上記コマンドを実施せずとも、下記コマンドだけで init と update を済ませることもできます。

git submodule update --init --recursive

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

サブモジュールを削除するには以下の手順で実施します。

git submodule deinit -f [サブモジュール名]
git rm -f [サブモジュール名]
rm -rf .git/modules/[サブモジュール名]

参考資料

Git関連のおすすめUdemy講座
Git関連のおすすめ書籍

コメント

タイトルとURLをコピーしました