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

Git

はじめに

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

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

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

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

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

手順

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

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

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

cd <サブディレクトリ>
git init
git add <サブファイル1> <サブファイル2>
git commit -m "comment"

cd ../
git submodule add <サブディレクトリ>
git commit -m "comment"

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

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

cd <サブディレクトリ>
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をコピーしました