# Git Submoduleの使い方

# submoduleを作る

$ git submodule add https://github.com/tubone24/hoge.git hoge

Cloning into 'bootstrap'...
remote: Counting objects: 12345, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 12345 (delta 6), reused 0 (delta 0), pack-reused 71220
Receiving objects: 100% (71220/71220), 100.84 MiB | 3.11 MiB/s, done.
Resolving deltas: 100% (44541/44541), done.
Checking connectivity... done.
1
2
3
4
5
6
7
8
9

これでレポジトリ直下に .gitmodule ができるのでこいつをコミットしてあげる

$ git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   .gitmodules
#       new file:   hoge
#

$ git add .
$ git commit -m "submodule入れた"
1
2
3
4
5
6
7
8
9
10
11
12

# submoduleの取り込み

どちらもsubmodule化した際のコミットでcloneされる

submoduleの取り込み対象commitは

$ git submodule
1

で確認できる

# submoduleのあるrepoをclone

$ git clone --recursive https://example.com/my-project.git
1

# submoduleのあるcrone済みrepoにsubmoduleの内容をとってくる

こっちのほうがよく使う

$ git submodule update --init --recursive
1

# submoduleの更新

submoduleが指し示すcommitを変更する

submoduleが難しいといわれるのはこの作業を submodule update -i と混同して表現している記事が多いからと思われる

submodule配下のディレクトリに移動して、指定のコミットへ移動(checkoutとかで)してpullして、コミットすればOK

$ cd hoge
$ git checkout master
$ git pull origin master
$ cd ..
$ git add hoge
$ git commit -m "Update submodule: hoge"
1
2
3
4
5
6

# submoduleディレクトリの移動

$ git mv hoge vendor/hoge
1

# submoduleディレクトリの削除

$ git submodule deinit hoge
1