git submoduleで、プロジェクトを親・子で管理する方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年8月)

✔このような疑問をお持ちの方へ

「git submoduleって具体的にどんな機能なのだろう?」
「git submoduleの使い方を学びたい」
「git submoduleの活用例を知りたい」

✔当記事で解説する内容

  • git submoduleの基礎知識
  • git submoduleの設定方法と活用法
  • git submoduleを活用した実例

当記事では、git submoduleの基本機能から、その設定方法、さらには具体的な活用例まで、詳しく説明いたします。

最後までお読みいただけますと、git submoduleについて深く理解できることでしょう。

ぜひご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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の特定のバージョンを指定すれば、ソフトウェアのバージョン管理をより細かく制御できます。

これらの知識を武器に、あなたのソフトウェア開発がより効率的で、より強力になることを願っています。

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