はじめに

このブログはHugoを使用しているのですが、Hugoでは様々なテーマを使用することができます。

Hugo Themes Site

各テーマはGitHubで管理されているため、Hugoのルートディレクトリ直下のthemesディレクトリ内でgit cloneコマンドを実行することで、使用可能となります。

$ pwd
/path/to/hugo/root/themes

$ git clone https://github.com/alanorth/hugo-theme-bootstrap4-blog.git

問題

ところが、テーマを適用してBitbucketにgit pushしたところ、ローカルには全ての実体ファイルがあるのに、Bitbucket上は当該テーマのファイル(ディレクトリ)だけが他のGitリポジトリへの参照となり、実体のファイルが無い状態となってしまいました。

(下記リンク先画像参照)

BitBucket - submodule not download when using git clone

このため、Bitbucket Pipelines内でのビルド(記事生成)がうまくいきませんでした。(指定したテーマのディレクトリがないというエラー)

原因

Git管理しているフォルダ内でさらに別のGitリポジトリからcloneしたため、作業ツリーが入れ子になっていました。

この入れ子になったフォルダをGit submoduleというらしいです。

このsubmoduleがBitbucket上では他のGitリポジトリへの参照となっていました。

対処

他のGitリポジトリのソースを実体として含めるため、Git subtreeを使います。

$ git subtree add --prefix=themes/<フォルダ名> --squash <GitリポジトリURL> <ブランチ名>

--squash オプションをつけない場合、元のコミットログに、addしたリポジトリのコミットログが混在してしまうため、見づらくなります。

# 実例
$ git subtree add --prefix=themes/hugo-theme-bootstrap4-blog --squash https://github.com/alanorth/hugo-theme-bootstrap4-blog.git master

これでBitbucketにpushしても、全てのファイルが実体のファイルとして扱われます。

まとめ

  • Git管理しているディレクトリ内に別のGitリポジトリからcloneすると、submoduleとなる。
  • submobuleはpushすると、実体ではなく当該リポジトリへの参照となる。
  • リポジトリにpushする時に、ファイルを実体としたい場合はsubtreeを使う。

参考