Gitのsubmoduleについて詳しくなかったので、記事にしました
サブモジュールとは
Gitのサブモジュール機能を使うと、プロジェクトで管理しているGitリポジトリとは別に、独立したリポジトリをプロジェクトに含ませることができます
サブモジュールを含んだプロジェクトでは、push・pullをしてもサブモジュール側のリポジトリには影響がありません
サブモジュールにするものは他リポジトリでも使うような共通機能であることが多いです
また、サブモジュールはあくまで特定コミットを示すポイントを追加したディレクトリに埋め込むものです
実際にどうやるの?
定番の操作について簡単に説明します
前提として、サブモジュール用のリポジトリとサブモジュール使うリポジトリの2種類が存在しています
サブモジュール用のリポジトリは下記画像です
そして、サブモジュール使うリポジトリは下記です
まずはサブモジュールを追加します
サブモジュール使うリポジトリにサブモジュール用のリポジトリを取り込むイメージです
git submodule add https://github.com/yasu1234/submodule_sample.git // サブモジュールを追加 git commit -a // 変更を保存
このとき必ず変更を保存してください!!
こうすることで、サブモジュール使うリポジトリにはサブモジュール用のリポジトリであるsubmodule_sampleのフォルダが作成されます
コミット後にプッシュすると以下のようになります
.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
の編集は必要ないです
最後に、サブモジュールはいろんなプロジェクトで使う共通ファイルや処理をまとめるのに便利な機能ですが、とりあえず共通化しているからつめこもうという気持ちでサブモジュールに追加すると後々面倒なことになるので、少し考えて追加するかを検討しましょう!!