【Git】submoduleで別々なリポジトリを階層的に管理する

Git

はじめに

流用性を上げるために、汎用的なファイル群とプロジェクト固有なファイル群を別々なリポジトリで管理します。

汎用的なファイル群を含めて1つのリポジトリで管理することもできますが、別なプロジェクトで流用するときに同じファイル群が大量生成されて容量の無駄+エンハンスがあったときに別リポジトリに反映するのは面倒です。

そこでgitの機能「submodule」を使用します。

以下のようなファイル構成で、トップディレクトリとサブディレクトリで別々にリポジトリを作成し、トップディレクトリからサブディレクトリを階層的に管理します

トップディレクトリ/(プロジェクト固有なファイル。)
  |--ファイル
  |--サブディレクトリ/(別なプロジェクトでも使用したい)
    |--ファイル

手順

上記のファイル構成を想定します。

リポジトリが作成されていないとき

cd <トップディレクトリ>
git init
git add <ファイル>
git commit -m "comment"

cd <submodule>
git init
git add <ファイル>
git commit -m "comment"

cd <トップディレクトリ>
git submodule add <submodule>
git commit -m "comment"

既存のリポジトリにsubmoduleを追加する

git clone <url>
git submodule add <submodule>
git commit -m "comment"

サブディレクトリを更新してトップディレクトリに反映させる

サブディレクトリ(submodule)に変更・コミットしていると、トップディレクトリでgit statusで確認できます。

cd <submodule>
git add -u
git commit -m "comment"

cd <トップディレクトリ>
git add -u
git commit -m "comment"

checkoutして以前のバージョンを反映させる

checkoutしただけではサブディレクトリ(submodule)は更新されません。以下で更新できます。

cd <トップディレクトリ>
git checkout <ハッシュ値>
git submodule update --recursive

サブディレクトリも一緒にcloneする

git hubやgit labにアップされているリポジトリをサブディレクトリ(submodule)も含めてcloneします。

git clone <utl> --recursive

まとめ

いろんな記事をみると、submoduleは毛嫌いされているみたいですね。

たしかに、checkoutしてサブのリポジトリが更新されないのは微妙ですが、トップのリポジトリのみを更新できなくなるので個人的には良いのかなと思います。

コメント

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