Git

Gitコマンドでサブモジュールを追加してみた

Gitコマンドでは、あるリポジトリに他のリポジトリ(=サブモジュール)を追加することができる。今回は、Gitコマンドでサブモジュールを追加してみたので、その手順を共有する。

なお、サブモジュールの詳細については、以下のサイトの「サブモジュールとは?」を参照のこと。
https://qiita.com/shizen-shin/items/5d1ae90a93e052801351

前提条件

Gitのインストール、GitHubのアカウント作成が、下記サイトの手順に従って実施済であること。

●Gitのインストール手順
https://eng-entrance.com/git-install

●GitHubのアカウント作成手順
https://qiita.com/ayatokura/items/9eabb7ae20752e6dc79d

やってみたこと

  1. 親モジュールとサブモジュールの作成
  2. 親モジュールにサブモジュールを追加
  3. 親モジュールからサブモジュールを削除

親モジュールとサブモジュールの作成

GitHub上に、サブモジュールの追加元となる親モジュールと、サブモジュールを追加する。その手順は、以下の通り。

1) GitHubにログインし、リポジトリ横の「New」ボタンを押下する。
親モジュールとサブモジュールの作成_1

2) 親モジュールとなるリポジトリ名「subModuleMain」を入力し、「Create repository」ボタンを押下する。
親モジュールとサブモジュールの作成_2

3) 以下のページが表示され、「subModuleMain」というリポジトリが作成されたことが確認できる。ここで、このリポジトリにファイルを追加するため、「creting a new file」リンクを押下する。
親モジュールとサブモジュールの作成_3

4) ファイル名、ファイル内容、コミットメッセージを指定し、「Commit new file」ボタンを押下する。
親モジュールとサブモジュールの作成_4

5) 以下のように、親モジュールとなるsubModuleMainリポジトリに指定したファイルが追加されたことが確認できる。
親モジュールとサブモジュールの作成_5

6) 同様に、サブモジュールとなるsubModuleSubリポジトリに「sub.txt」を作成する。作成後のリポジトリは以下の通り。
親モジュールとサブモジュールの作成_6



親モジュールにサブモジュールを追加

git submodule addコマンドを利用すると、親モジュールにサブモジュールを追加することができる。その手順は、以下の通り。

1) 親モジュールを取得するディレクトリ上で右クリックし、「Git Bash Here」メニューを選択する。
サブモジュールの追加_1

2) 以下のように、Git Bash(gitを操作する際に使うターミナル)が起動することが確認できる。
サブモジュールの追加_2

3) GitHub上で親モジュールを開き、「Code」ボタンを押下すると、親モジュールのURLが確認できる。ここで確認したURLは「https://github.com/purin-it/subModuleMain.git」となる。
サブモジュールの追加_3

4) 「git clone (親モジュールのURL)」 を実行し、GitHubから親モジュールとなるリポジトリ「subModuleMain」の内容をローカルに取得する。
サブモジュールの追加_4

5) 「ls -lR」や「cat (参照するファイル名)」を実行すると、以下のように、「subModuleMain」ディレクトリ下に、GitHub上にあった「main.txt」が取得できたことが確認できる。
サブモジュールの追加_5

6) GitHub上でサブモジュールを開き、「Code」ボタンを押下すると、サブモジュールのURLが確認できる。ここで確認したURLは「https://github.com/purin-it/subModuleSub.git」となる。
サブモジュールの追加_6

7) 親モジュールの「subModuleMain」フォルダに移動後に、「git submodule add (サブモジュールのURL)」コマンドで、subModuleSubリポジトリをサブモジュールとして追加する。
サブモジュールの追加_7

8) 「ls -lR」や「cat (参照するファイル名)」を実行すると、以下のように、「subModuleSub」ディレクトリ下に、GitHub上にあったサブモジュールのファイル「sub.txt」が取得できたことが確認できる。
サブモジュールの追加_8

9) また、サブモジュールを追加したことで、以下のように、「.gitmodules」ファイルが作成され、ここにサブモジュールへの参照パスが記載されていることが確認できる。
サブモジュールの追加_9

10) サブモジュール追加後のファイルをローカル端末で確認した結果は、以下の通り。
サブモジュールの追加_10_1

サブモジュールの追加_10_2

11) サブモジュール追加後に「git status」コマンドで状況を確認すると、以下のように、コミットが必要なファイルやフォルダが表示される。
サブモジュールの追加_11

12) これらのファイルやフォルダを「git commit」コマンドでコミットし、コミット後の状況を「git status」コマンドで確認する。
サブモジュールの追加_12

13) コミットした内容をGitHubに反映するため、「git push」コマンドを実行する。なお、今回は「main」ブランチ上で操作しているため、「git push origin main」と実行している。
サブモジュールの追加_13

14) 「git push」コマンドを実行した後に、GitHubの内容を確認すると、以下のように、サブモジュールが追加されていることが確認できる。また、「subModuleSub@7674c74」のリンクを押下すると、サブモジュール内のファイルも追加されていることが確認できる。
サブモジュールの追加_14_1

サブモジュールの追加_14_2



親モジュールからサブモジュールを削除

追加したサブモジュールは、削除することもできる。その手順は、以下の通り。

1) 「git submodule deinit (サブモジュールのパス)」コマンドで、サブモジュールを削除する。
サブモジュールの削除_1

2) 「git rm -rf (サブモジュールのパス)」コマンドで、サブモジュールのディレクトリそのものを削除する。
サブモジュールの削除_2

3) サブモジュール削除後の「.gitmodules」ファイルを確認すると、以下のように、中身が空になっていることが確認できる。
サブモジュールの削除_3

4) サブモジュール削除後のファイルをローカル端末で確認した結果は、以下の通り。
サブモジュールの削除_4

5) サブモジュール削除後に「git status」コマンドで状況を確認すると、以下のように、コミットが必要なファイルやフォルダが表示される。
サブモジュールの削除_5

6) これらのファイルやフォルダを「git commit」コマンドでコミットし、コミット後の状況を「git status」コマンドで確認する。
サブモジュールの削除_6

7) コミットした内容をGitHubに反映するため、「git push」コマンドを実行する。
サブモジュールの削除_7

8) 「git push」コマンドを実行した後に、GitHubの内容を確認すると、以下のように、追加したサブモジュールが削除されていることが確認できる。
サブモジュールの削除_8

9) このままだと「.git/modules」ディレクトリ下にサブモジュールが残ったままになっているため、rmコマンドを用いて、「.git/modules」ディレクトリ下のサブモジュールのフォルダを削除する。
サブモジュールの削除_9

●参考サイト
https://qiita.com/knsh14/items/941f2ec2ec76ef1d1940

要点まとめ

  • 「git submodule add (サブモジュールのURL)」コマンドで、サブモジュールを追加できる。
  • サブモジュールへの参照パスは、サブモジュール追加時に作成された「.gitmodules」ファイルに記載される。
  • 追加したサブモジュールを削除するには、 「git submodule deinit (サブモジュールのパス)」コマンドを実行後、「git rm -rf (サブモジュールのパス)」コマンドを実行し、.git/modulesディレクトリ下のサブモジュールのディレクトリを削除する。