くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Gitのサブモジュールについて

Gitのsubmoduleについて詳しくなかったので、記事にしました

サブモジュールとは

Gitのサブモジュール機能を使うと、プロジェクトで管理しているGitリポジトリとは別に、独立したリポジトリをプロジェクトに含ませることができます

サブモジュールを含んだプロジェクトでは、push・pullをしてもサブモジュール側のリポジトリには影響がありません

サブモジュールにするものは他リポジトリでも使うような共通機能であることが多いです

また、サブモジュールはあくまで特定コミットを示すポイントを追加したディレクトリに埋め込むものです

実際にどうやるの?

定番の操作について簡単に説明します

前提として、サブモジュール用のリポジトリとサブモジュール使うリポジトリの2種類が存在しています

サブモジュール用のリポジトリは下記画像です

f:id:kumaskun:20200719230654p:plain
サブモジュール用リポジトリ

そして、サブモジュール使うリポジトリは下記です

f:id:kumaskun:20200719231348p:plain
サブモジュールを使うリポジトリ

まずはサブモジュールを追加します

サブモジュール使うリポジトリにサブモジュール用のリポジトリを取り込むイメージです

git submodule add https://github.com/yasu1234/submodule_sample.git // サブモジュールを追加
git commit -a  // 変更を保存

このとき必ず変更を保存してください!!

こうすることで、サブモジュール使うリポジトリにはサブモジュール用のリポジトリであるsubmodule_sampleのフォルダが作成されます

f:id:kumaskun:20200719231923p:plain

コミット後にプッシュすると以下のようになります

f:id:kumaskun:20200719232411p:plain

.gitmodulesというファイルと、サブモジュールのディレクトリが追加されています

別の人がtest_submoduleの最新版を落としてきた時に.gitmodules内の情報を元にサブモジュールのリモートリポジトリに接続しにいきます

また、サブモジュールの部分を見るとわかるようにコミットIDで管理されています。

仮にサブモジュールを更新して、その修正を反映したい場合はサブモジュールのコミットIDの変更をコミット・プッシュする必要があります

クローンする場合

サブモジュールを含むプロジェクトをクローンする場合は単純にそのプロジェクトをクローンすればいいわけではありません

実際は複数のプロジェクトが入り混じっているのですから

そういうときは。recursiveオプションをつけることで解決します

git clone --recursive https://github.com/yasu1234/test_submodule.git

recursiveオプションをつけることでサブモジュールを初期化、アップデートしています

なので、もしクローン時にrecursiveオプションをつけ忘れた場合は下記コマンドでクローン後に実施出来ます

git submodule update --init --recursive

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

削除する場合は下記コマンドを実行します

git submodule deinit 【サブモジュールのパス】

rm -rf .git/modules/【サブモジュールのパス】

上記のコマンドが.gitmodules.git/configの設定を自動で消してくれるため、git configの編集は必要ないです

最後に、サブモジュールはいろんなプロジェクトで使う共通ファイルや処理をまとめるのに便利な機能ですが、とりあえず共通化しているからつめこもうという気持ちでサブモジュールに追加すると後々面倒なことになるので、少し考えて追加するかを検討しましょう!!

参照

Gitのサブモジュール機能を使ってプロジェクトを管理してみよう

Git submoduleの押さえておきたい理解ポイントのまとめ