[Git] git submodule は癖がすごいとの噂だったが素直につきあっていけそうという話

memo.

[markdown]
以前にちょっと調べたときに git submodule は[癖がすごい](https://www.google.co.jp/search?q=%E7%99%96%E3%81%8C%E3%81%99%E3%81%94%E3%81%84+%E5%8D%83%E9%B3%A5&oq=%E7%99%96%E3%81%8C%E3%81%99%E3%81%94%E3%81%84+&aqs=chrome.1.69i57j0.5403j0j1&sourceid=chrome&es_sm=119&ie=UTF-8)ようだったので後回しにしていました。

“`prettyprinted
% git –version
git version 1.9.2
“`

## プロジェクトにサブモジュールを加える

### サブモジュールを追加する

ディレクトリを指定して submodule を追加する。

“`prettyprinted
% git submodule add https://gist.github.com/6694891.git WordPress
“`

関連ファイルが作成される。

“`prettyprinted
% git status
On branch master
Your branch is up-to-date with ‘origin/master’.
Changes to be committed:
(use “git reset HEAD …” to unstage)
new file: .gitmodules
new file: WordPress
“`

“`prettyprinted:.gitmodules
[submodule “WordPress”]
path = WordPress
url = https://gist.github.com/6694891.git
“`

.git/config にも記載されているので、`git submodule init` で初期化する必要は無くなったよう。

“`prettyprinted:.git/config
[submodule “WordPress”]
url = https://gist.github.com/6694891.git
“`

既にファイルがステージされているので `git commit` する。

“`prettyprinted
% git commit -m ‘add submodule: WordPress’
“`

GitHub へ push したところ、こんな表示がされました。

2014-05-21_git_01

### 登録したサブモジュールを更新する

登録したサブモジュールを更新します。

“`prettyprinted
% git submodule update
Submodule path ‘WordPress’: checked out ‘542a00a3c0be3c6dd40c989f67dfd28dc8772900’
“`

サブモジュール内のサブモジュールも更新したいといった場合、`–recursive` で再帰的に更新するそう。

“`prettyprinted
% git submodule update –recursive
“`

> * [自分が必要とする最低限の git submodule の知識 – Qiita](http://qiita.com/ma2saka/items/4bd00ef6f8c240847807)

### サブモジュールを削除する

“`prettyprinted
% git submodule deinit WordPress
Cleared directory ‘WordPress’
Submodule ‘WordPress’ (https://gist.github.com/6694891.git) unregistered for path ‘WordPress’
% git rm -rf WordPress
rm ‘WordPress’
“`

> * [git submoduleを今風な感じで削除する – Qiita](http://qiita.com/u1aryz/items/8d1923da79158439eeaa)

.gitmodules, .git/config からも消えている。
`git submodule status` にも何も表示されない。

“`prettyprinted
% git submodule status
% git status
On branch master
Your branch is ahead of ‘origin/master’ by 1 commit.
(use “git push” to publish your local commits)
Changes to be committed:
(use “git reset HEAD …” to unstage)
modified: .gitmodules
deleted: WordPress
% git commit -m ‘delete submodule: WordPress’
“`

## サブモジュールを含んだプロジェクトを git clone する

GitHub に追加したサブモジュールを含むプロジェクトを git clone してみます。

2014-05-21_git_01

### git clone

“`prettyprinted
% git clone git@github.com:DriftwoodJP/VMs.git submodule_test
“`

サブモジュールのディレクトリには何も含まれていません。

“`prettyprinted
% ls WordPress
% git submodule status
-7e0a09da27c3e6ce563ee5bc7e2b360e0b765101 WordPress
“`

.git/config には情報がないので init します。

“`prettyprinted
% git submodule init
Submodule ‘WordPress’ (https://gist.github.com/6694891.git) registered for path ‘WordPress’
“`

update するとサブモジュール内のファイルをクローンしてくれます。

“`prettyprinted
% git submodule update
Cloning into ‘WordPress’…
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 18 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (18/18), done.
Checking connectivity… done.
Submodule path ‘WordPress’: checked out ‘7e0a09da27c3e6ce563ee5bc7e2b360e0b765101’
% ls WordPress
Vagrantfile provision.sh
“`

以後、サブモジュールに更新があり、これを反映させたい場合は `git submodule update` を実行すればよいようです。

> * [Git – サブモジュール](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)

### git clone –recursive

git clone 時に、`submodule init`, `update` も一度に済ませたい場合は、`–recursive` オプションが使えます。

“`prettyprinted
% git clone –recursive git@github.com:DriftwoodJP/VMs.git submodule_test
Cloning into ‘submodule_test’…
remote: Reusing existing pack: 19, done.
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 22 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (22/22), done.
Resolving deltas: 100% (2/2), done.
Checking connectivity… done.
Submodule ‘WordPress’ (https://gist.github.com/6694891.git) registered for path ‘WordPress’
Cloning into ‘WordPress’…
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 18 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (18/18), done.
Checking connectivity… done.
Submodule path ‘WordPress’: checked out ‘7e0a09da27c3e6ce563ee5bc7e2b360e0b765101’
“`

> * [git submoduleについてのメモ – rcmdnk’s blog](http://rcmdnk.github.io/blog/2013/10/18/computer-git/)

## サブモジュールの中を更新したい場合はブランチをきる

のちのち、`git submodule update` で作業が消えないようにブランチを切ります。

“`prettyprinted
% git checkout -b ‘work’
Switched to a new branch ‘work’
“`

サブモジュール内で、今回のプロジェクトに合うようにファイルを変更しました。

“`prettyprinted
% git add .
% git commit -m ‘Update submodule: Ready for this project’
[work cecf526] Update submodule: Ready for this project
2 files changed, 3 insertions(+), 2 deletions(-)
create mode 100644 .gitignore
“`

サブモジュールの外に出て、ステータスを確認します。
新しいコミットがあるよと教えてくれます。

“`prettyprinted
% cd ../
% git status
On branch dev
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout — …” to discard changes in working directory)
modified: WordPress (new commits)
no changes added to commit (use “git add” and/or “git commit -a”)
“`

外側でも、`git add` して `git commit` します。

“`prettyprinted
% git add WordPress
% git commit -m ‘Update VagrantFile: Ready for this project’
[dev c9f1f5b] Update VagrantFile: Ready for this project
1 file changed, 1 insertion(+), 1 deletion(-)
“`

> * [Git submodule の基礎 – Qiita](http://qiita.com/sotarok/items/0d525e568a6088f6f6bb)
> * [Git – サブモジュール](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)

つよがってみましたが、先人のおかげで何とかなりそうです。

## 補遺

以前と同じ名前でサブモジュールを追加するとこんなことを言われるので、指示通り `-f` を付けるか別の名前を付けるかすればよい。

“`prettyprinted
% git submodule add https://gist.github.com/6694891.git WordPress
A git directory for ‘WordPress’ is found locally with remote(s):
origin https://gist.github.com/6694891.git
If you want to reuse this local git directory instead of cloning again from
https://gist.github.com/6694891.git
use the ‘–force’ option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the ‘–name’ option.
% git submodule add -f https://gist.github.com/6694891.git WordPress
Reactivating local git directory for submodule ‘WordPress’.
“`

[transitive.info – Git 使い方 見出し一覧](http://transitive.info/article/git/) がすごい。

> * [transitive.info – git submodule 使い方](http://transitive.info/article/git/command/submodule/)

[/markdown]