Trying out git submodules

前回の記事 Hello World! with Hexo で使ったテーマはgithubからクローンしてきたものなので、変更をgit管理しようとするとレポジトリの中にレポジトリがある状態になる。
これをするとcommitしたときに、gitが注意してくる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git commit -m "change theme"
warning: adding embedded git repository: child
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint: git submodule add <url> child
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint: git rm --cached child
hint:
hint: See "git help submodule" for more information.

どうやらサブモジュールというのでレポジトリをネスト出来るらしい。

とりあえずやってみた

詳しい説明はこのページに任せます: Git - サブモジュール
サブモジュールで特徴的なのは、ネストされたレポジトリがコミット単位で参照されること。

1
$ git submodule add git@github.com:sabrinaluo/hexo-theme-replica.git themes/replica

とりあえずこれで良さそうだ。

自分のレポジトリをサブモジュール管理

先程追加したのはsabrinaluo様のレポジトリだ。
自分がテーマに加えた変更もgit管理したいので、githubでforkした。
fork on github
これをサブモジュール管理する。

これを先程のように追加しようとした。

1
$ git submodule add git@github.com:leojojo/hexo-theme-replica.git themes/replica

問題がなさそうなのでこのままデプロイしてみようとすると、git cloneに失敗してしまった。

1
2
3
4
5
Error checking out submodules: error: Server does not allow request for unadvertised object
2649dc0fb95530bd63c6f7c5243a8f73504487fe
Fetched in submodule path 'themes/replica', but it did not contain
2649dc0fb95530bd63c6f7c5243a8f73504487fe.
Direct fetching of that commit failed.

成功

1
2
3
$ rm .gitmodules
$ git rm -r themes/replica
$ git submodule add git@github.com:leojojo/hexo-theme-replica.git themes/replica

これで目的のレポジトリがcloneし直され、正しくサブモジュールになったようだ。
一度消した.gitmodulesも生成され直されている。
やったー

githubではこのような表示になる。

submodule on github

テーマも微編集できた
これでブログの細かい部分も直せた。