本記事の概要
Hugo+Blowfishテーマでのgit worktreeの注意点です。
平たく言えば、submoduleを含むgitリポジトリでgit worktreeを使う場合の注意点になります。
前提
Hugo+Blowfishテーマ適用済みの環境です。
なお、Windowsでの操作を想定しています。
(本記事が属するアドベントカレンダーについてもご確認ください)
前置き(興味のない人は読み飛ばしてもOKです)
Hugoという静的サイトジェネレーターで、個人サイトを作っていた時のお話です。
Hugoにはテーマという機能があり、第三者が作ったテーマを取り込むことで、自分好みの見た目にしたりすることが出来ます。
テーマの導入方法は複数あるのですが、私の使用しているBlowfishというテーマは、gitの持つsubmodule機能を使ってインストールします。
そこで、git worktreeを使った時にハマった内容について書いた記事です。
念のため、簡易的にディレクトリ構成を書くと、my-siteというリポジトリで管理している場合、下記のようになります。
my-site/
├── .git/
├── 自サイトを作るためのディレクトリ(複数)/
├── themes/
│ └── blowfish/
│ └── gitのsubmodule機能でblowfishのリポジトリからファイルを取得する
└── .gitmodules
git worktreeについて
簡単に言えば、gitのブランチを別ディレクトリに落としてくる機能です。
当然、worktree側からもコミットできます。
worktreeを使用しない場合は、checkoutするブランチを切り替えながら作業することになる為、複数ブランチで同時並行的に対応するのが大変ですが、
git worktreeを使うことで、それぞれのブランチを別ディレクトリに落として作業できるので、複数ブランチに対して同時並行で作業することも可能です。
gitにはdiffコマンドがあるのでブランチ間のdiff確認も容易ではありますが、ローカルに落としてきてWinMerge等のツールでdiffを取りたいといった場合にも便利です。
worktreeの追加と注意点
前提として、下記のようにwork/my-site内にmasterブランチをチェックアウト済みとします。この時に、XXXブランチをmy-site-XXX内に追加する方法を説明します。
work/
├── my-site/
│ └── masterブランチの内容
└── my-site-XXX/
└── XXXブランチの内容
XXXブランチをworktreeとして追加するには、my-siteディレクトリ内で下記のようにコマンドを打てば良いです。
git worktree add ../my-site-XXX XXX
要は「git worktree add ディレクトリ ブランチ名」という風に打てばOKです。
さて、my-site-XXXでXXXブランチの作業をすることになりますが、ここで注意点があります。
worktree作成直後は、submoduleがチェックアウトされていません。
Hugoで言えば、テーマがチェックアウトされていないので正しくビルドできません。
そのため、my-site-XXXディレクトリで、下記のようにコマンドを打ってSubmoduleを更新してあげる必要があります。
git submodule update --remote --merge
worktree一覧の確認方法
下記のようにして確認できます。
git worktree list
worktreeでの作業
my-site-XXXブランチでコミット等の作業は通常のディレクトリと同様にできます。
XXXブランチに必要な作業をmy-site-XXXで行えばよいです。
worktreeの削除
XXXブランチでの作業が終了し、my-site-XXXディレクトリが不要になったとします。
my-siteディレクトリで下記のように打つと削除できます。
git worktree remove -f ..\my-site-XXX\
要は「git worktree remove -f ディレクトリ」という風に打てばOKです。
ここでの注意点は -f です。
-fを付けないと削除できませんのでご注意ください。