Hugoのテーマをgitのsubmoduleで管理し始めた

はじめに

このブログはHugoで生成しているのですが、テーマはブログのリポジトリと別で管理しています。

これまでは、ブログのリポジトリの theme/ ディレクトリにzipとかで落としてきて展開していました。
ですが、テーマのアップデート時に再度その作業を行うのは面倒だなと思い調べていた所、gitのsubmodule機能を使うことで、テーマのリポジトリをブログのリポジトリに取り込むことが出来る。つまり該当のテーマの所へ行けばgit pullできる。

git submodule は、外部の git リポジトリを、自分の git リポジトリのサブディレクトリとして登録し、特定の commit を参照する仕組みです。

Git submodule の基礎 - Qiita

Hugoの公式でもやってるテーマの管理方法ですね

submoduleで取り込む

とりあえず、今の状態はこんな感じ。

.
├── README.md
├── archetypes
├── config.toml
├── content
├── layouts
├── public
├── static
└── themes
       ├── beautifulhugo
       └── hugo-gentoo-theme

beautifulhugoが初めた頃から使ってたテーマで、今回追加したいのは、申請中の minimage というテーマ。

新規ファイルをsubmodule化してみる

コマンドは簡単です。

$ git submodule add https://github.com/d-kusk/minimage minimage

すると、themes/ と .gitsubmodule で差分が発生している状態になるのでコミットする。
これでサブモジュールとして登録できました。

Hugoの特性上 themes/ 内のファイルはpullで上書きして、変更があるものは layouts の中にコピーして触るという事になっているのですが、更新工程がだいぶ楽になるんじゃないかなって思いました。

既存のファイルをsubmoduleに変える

一方、既にあるhugo-gentoo-themeをサブモジュール化するとき、ちょっと大変でした。

$ git rm -r hugo-gentoo-theme // 一旦git管理から外す

$ git submodule add -f https://github.com/d-kusk/hugo-gentoo-theme hugo-gentoo-theme

既にgit管理されてしまっているからだと思いますが、submodule addでは通らなかったので、helpで出てきた–fourceオプションを追加することでsubmoduleとして追加できました。

git で、すでに管理していたファイルをサブモジュール管理に切り替えたい - neulog

※一応master以外の別ブランチで作業する方がいいと思うんですが、masterに切り替えるときにちょっと怪しかったので慎重にやってください。

submoduleの更新

以下のコマンドを見かけたのでやってみたのですが反応が無く。

$ git submodule update

最終的に親のリポジトリで以下を実行することで更新できました。
foreachを使うことで、全てのsubmoduleでgit pullを行うことになります。

$ git submodule foreach git pull

実行すると、親リポジトリで差分が発生するので、それをコミットする事で反映できました。

ちょっと理解しきらず使ってる所があるので不安があるけど、少しずつ使っていって理解したい。