» TechAcademyの無料体験

外部のリポジトリをサブディレクトリとして扱う「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/[サブモジュール名]

参考資料

コメント

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