(最終更新日:2023年8月)
✔このような疑問をお持ちの方へ
「git submoduleって具体的にどんな機能なのだろう?」
「git submoduleの使い方を学びたい」
「git submoduleの活用例を知りたい」
✔当記事で解説する内容
- git submoduleの基礎知識
- git submoduleの設定方法と活用法
- git submoduleを活用した実例
当記事では、git submoduleの基本機能から、その設定方法、さらには具体的な活用例まで、詳しく説明いたします。
最後までお読みいただけますと、git submoduleについて深く理解できることでしょう。
ぜひご覧ください。
Gitの基本とsubmoduleについて
こちらでは、Gitとその一部であるgit submoduleの基本について説明します。
- gitとは何か
- git submoduleとは
gitとは何か
Gitは、2005年にLinuxの開発者であるリーナス・トーバルズによって作られた分散型バージョン管理システムです。
個々のバージョン(変更)を、特定の時点でのスナップショットとして保存し、プロジェクトのあらゆるファイルのバージョンを効率的に管理できます。
このシステムにより、開発者は過去のバージョンを参照したり、変更を元に戻したりすることが簡単にできるのです。
git submoduleとは
git submoduleは、Gitの強力な機能のひとつ。
ほかのGitリポジトリをあるGitリポジトリのサブディレクトリとして組み込む機能です。
これはライブラリやほかのプロジェクトを、自身のプロジェクトに含めるときなどに使われます。
各サブモジュールは、それ自体が独立したGitリポジトリで、それぞれが独自の歴史を持つことが可能です。
開発者は個々のサブモジュールを別々に更新・管理でき、プロジェクトの管理が容易になります。
git submoduleの理解と初歩的な使用法
こちらでは、git submoduleの基本的な理解と使用法について詳しく学んでいきます。
- submoduleの定義と役割
- submoduleの生成
- はじめてのsubmodule追加
submoduleの定義と役割
前述の通り、git submoduleはあるGitリポジトリ内で別のGitリポジトリを参照するための方法です。
主要な用途としては、共有ライブラリやフレームワークのような他のプロジェクトをリポジトリに含めることが挙げられます。
これにより、そのライブラリの更新がプロジェクトに直接影響を与えないよう管理できます。
submoduleの生成
git submoduleを生成するには、以下のコマンドを使用します。
git submodule add <リポジトリのURL> <配置したいパス>
これにより、指定したURLからリポジトリをクローンし、そのサブディレクトリを新しいサブモジュールとして追加します。
たとえば、以下のコマンドは、GitHub上の特定のリポジトリをサブモジュールとして追加します。
git submodule add https://github.com/exampleuser/examplelib.git libs/examplelib
このコマンドは、新しいサブモジュールをlibs/examplelib
ディレクトリに配置します。
はじめてのsubmodule追加
既に述べたように、git submodule add
コマンドを使用して新しいサブモジュールを追加します。
次にこのコマンドを使用してサブモジュールを追加し、その内容を確認してみましょう。
git submodule add https://github.com/exampleuser/examplelib.git libs/examplelib
cd libs/examplelib
git status
最後のgit status
コマンドは、新しく追加したサブモジュールのステータスを確認します。
コマンドで指定したファイルだけでなく、.gitmodulesというファイルもできているのに気づきましたか?こちらでサブモジュールファイルを管理しています。
サブモジュールを管理する「.gitmodules」です。
[submodule "libs/examplelib"]
path = libs/examplelib
url = https://github.com/exampleuser/examplelib.git
git submoduleの操作実践
こちらでは、実際にgit submoduleを操作してみることで、より深く理解することを目指します。
- プロジェクトのクローニングとsubmodule
- submoduleを活用したプロジェクト運用
- 更新・変更の適用と公開
プロジェクトのクローニングとsubmodule
git submoduleを含むプロジェクトをクローンする場合、初めてサブモジュールを利用する際には、手動で初期化と更新をおこないましょう。
以下に、その手順を示します。
git clone https://github.com/username/project.git
cd project
git submodule init
git submodule update
これで、git submoduleが正常に初期化され、最新のコミットに更新されます。
submoduleを活用したプロジェクト運用
サブモジュールを含むプロジェクトで作業をおこなう際には、そのサブモジュールもまた独立したgitリポジトリであることを忘れてはなりません。
つまりサブモジュール内での作業は、そのディレクトリ内でgitコマンドを実行することになります。
cd libs/examplelib
echo "# Changes to submodule" >> README.md
git add README.md
git commit -m "Update README in submodule"
この例では、サブモジュール内のREADMEファイルを更新し、その変更をコミットしています。
更新・変更の適用と公開
サブモジュールの上流で変更がおこなわわれた場合や、自分でサブモジュールに変更を加えた場合、それを取り込み公開する方法があります。
まず、サブモジュールの上流で行われた変更を取り込むには以下のようにします。
cd libs/examplelib
git pull origin master
次に、自分で加えた変更を公開するには、通常のgitリポジトリと同じようにpushします。
git push origin master
最後に、これらの変更をメインのプロジェクトに反映するには、プロジェクトのルートに戻ってコミットします。
cd ../..
git add libs/examplelib
git commit -m "Update submodule"
git push origin master
これにより、サブモジュールでの変更がメインのプロジェクトにも反映され、公開されます。
より効率的なsubmodule運用のために
こちらでは、git submoduleをさらに効率よく利用するためのテクニックを紹介します。
- Foreachやエイリアスを活用した効率化
- submoduleでの作業時の注意点
- submoduleの更新と適切なチェックアウト方法
Foreachやエイリアスを活用した効率化
git submoduleには、foreachというコマンドで、全てのsubmoduleに対して同じ操作をおこえます。
複数のsubmoduleを扱う場合、ひとつずつの操作は手間がかかってしまうからです。
例えば以下は、全てのsubmoduleを最新の状態に更新する例になります。
git submodule foreach git pull origin master
またよく使うコマンドを、短縮形で使えるようにエイリアスを設定することも可能。
「git su」というコマンドで、上記のコマンドを実行する例です。
git config alias.su "submodule foreach git pull origin master"
submoduleでの作業時の注意点
submoduleを使用する際には注意すべき点がいくつかあります。
- submoduleは独立したgitリポジトリであるため、そのリポジトリで作業する際には別々のcommitを作成する必要がある
- メインのリポジトリでsubmoduleをaddやcommitするときには、それはsubmoduleの現在のcommitへのポインタを更新するだけであり、submodule自体の変更を反映するわけではない
submoduleの更新と適切なチェックアウト方法
submoduleを更新するには、それぞれのディレクトリに移動してpullするか、git submodule foreachを使用します。
submoduleを特定のコミットに固定したい場合には、以下のようにチェックアウトしてください。
cd libs/examplelib
git checkout <commit-hash>
cd ../..
git add libs/examplelib
git commit -m "Pin submodule to specific commit"
またクローンした直後や、他人がsubmoduleを更新した後など、submoduleのポインタが更新された場合には、submodule updateコマンドを使用してローカルのsubmoduleを正しい状態にします。
git submodule update --init --recursive
これらの操作を覚えることで、git submoduleをより効果的に使えるでしょう。
まとめ
当記事の内容をまとめます。
- git submoduleは、他のgitリポジトリを現在のリポジトリ内に埋め込める
- submoduleにより、ソフトウェアプロジェクトの依存関係管理を容易にできる
- git submoduleを作成するためには
git submodule add
コマンドを使う
ただし、submoduleの変更はメインのリポジトリからは直接は管理されず、それぞれが独立したリポジトリとして扱われる点が重要です。
また、Foreachやエイリアスを用いることで、submoduleの操作を効率化も可能になります。
またこれまでの内容をマスターしたら、さらなる深みへと進んでみてください。
特定のsubmoduleの特定のバージョンを指定すれば、ソフトウェアのバージョン管理をより細かく制御できます。
これらの知識を武器に、あなたのソフトウェア開発がより効率的で、より強力になることを願っています。