August 6, 2017

Git submoduleの使い方

ちょっと自分でも混乱したので、覚書です。

なぜSubmoduleが必要か?

今月からブログ用に静的ジェネレーターのHugo移行しました。 移行に際してGitのリポジトリを介して自動ビルド しています。

HugoではテーマがGitHubなどで公開されているケースがほとんどです。 ローカルで生成するならば単にクローンしてくれば良いのですが、GitHubやbitbucketなどにブログのソースを置いて自動ビルドをかけようとすると、これらテーマのリポジトリの関係もきちんとしておく必要があります。

Gitでのsubmoduleを追加する

ここでは、自分のブログのリポジトリをmy-blogとし、テーマも自作のものを利用しているとしてそのリポジトリをmy-themeとします。

自作テーマを自分のhugoのリポジトリに適用するには、以下のようにします。

[~] $cd my-blog
[~/my-blog] $ git submodule add https://github.com/yourid/my-theme.git

これでクローンした時と同じようにテーマのリポジトリがダウンロードされてきます。 クローンした時と異なるのは、my-blogのリポジトリ内に.gitmodulesというファイルが作成されていることです。(不可視ファイルなので、ls -laなどで確認してください。)

.gitmodulesは以下のようになっているはずです。

[submodule "themes/my-theme"]
	path = themes/my-theme
	url = https://github.com/yourid/my-theme.git

submoduleの変更

ブログを運用しているうちにテーマを修正したくなった場合の対応です。 私は、ここちょっと混乱しました。

前提としてローカルではブログとテーマの修正用リポジトリはそれぞれ別に管理しているものとします。

以下は、ローカルにテーマのリポジトリをクローンしてきて、修正を加えてリモートのリポジトリに反映するまでです。

[~] $ git clone https://github.com/yourid/my-theme.git
[~] $ cd my-theme
[~/my-theme] $
    〜 ここで必要な修正をかける 〜
[~/my-theme] $ git add .
[~/my-theme] $ git commit -m"modified iframe styles"
[~/my-theme] $ git push

ローカルにあるブログのリポジトリでは、内部にあるテーマは上記の修正を含んでいません。これを反映させる必要があります。

このため、まずテーマのリポジトリをプルしてきてその状態のブログのリポジトリをプッシュする必要があります。

[~/my-blog] $ cd themes/my-theme
[~/my-blog/themes/my-theme] $ git pull
[~/my-blog/themes/my-theme] cd ../..
[~/my-blog] $ git add themes/my-theme
[~/my-blog] $ git commit -m"update my-theme"
[~/my-blog] $ git push

これでブログとテーマのリポジトリの関係を最新状態にして維持できるようになります。

© 沙門