開発を進めるにあたって、マークアップ用のリポジトリから開発用のリポジトリに静的なファイルを取り込みたいという場面があり、その際に手動でコピーするのは管理が大変で何か良い方法がないかと探していました。
そこで、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/[サブモジュール名]
コメント