#はじめに
この記事は、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への追加をしてくれます。