はじめに
この記事は、Dockerでコンテナごとにリポジトリ分けたいと思ったときに見つけた方法を備忘録として残したものです!
今回大きなリポジトリにまとめる方法としてこのサイトを参考にして、git submoduleを使うことにしました!
git submodule とは
あるリポジトリ1を別のリポジトリ2の一部として使いたい。だけど、リポジトリ1は個別で管理したいという問題を解決できるGitの機能です!
具体的には
外部の git リポジトリを、自分の git リポジトリのサブディレクトリとして登録し、特定の commit を参照する仕組み
です。
使ってみる
準備
-
大元となる
git_submodule_practiceリポジトリとサブリポジトリであるsub_repositoryをGitHub上で作成。 -
git_submodule_practiceをローカルにcloneして、git_submodule_practice内にsub_repositoryをcloneする。 -
各ディレクトリ配下にREADME.mdを作成し、そのディレクトリにcommitしておく
今のディレクトリ構造です。
.
├── README.md
├── .git
└── sub_repository
├── .git
└── README.md
この状態でgit_submodule_practiceディレクトリでgit statusをしてみます。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
sub_repository/
nothing added to commit but untracked files present (use "git add" to track)
sub_repository配下がgitにtrackされています。この状態だとsub_repository内の差分もgit_submodule_practiceで管理されてしまいます。
submodule化する
submodule化するのはこのコマンド!git_submodule_practice直下で実行してください。後ろのurlはcloneするときのurlです。sshでも問題ないです。
$ git submodule add https://github.com/{GitHubアカウント 名}/sub_repository.git
Adding existing repo at 'sub_repository' to the index
結果として、以下の文字
'sub_repository' does not have a commit checked out
が出てきたらsub_repository内でREADME.mdをcommitしましょう。submoduleはcommitを参照しているため、一つもcommitがないとsubmodule化ができません。
今のディレクトリ構造です。
.
├── README.md
├── .git
├── .gitmodules
└── sub_repository
├── .git
└── README.md
.gitmodulesというファイルができましたね?そのファイルをのぞいてみると以下のようになります。ここにsubmoduleを追跡しないようにigunoreを記載しましょう!
[submodule "sub_repository"]
path = sub_repository
url = https://github.com/{GitHubアカウント 名}/sub_repository.git
ignore = all //追記
これで、sub_repositoryはsubmodule化され、変更は大元となるgit_submodule_practiceに反映されなくなりました!!
追記
大元のgit_submodule_practiceのディレクトリにcloneする前であれば、git submodule add https://github.com/{GitHubアカウント 名}/sub_repository.gitでgit clone + submoduleへの追加をしてくれます。