備忘録です。

このブログもjekyllで書いてまして、gitのhook使って自動デプロイするわけですが……

以下が動かなかったhook(post-receive)です(こちらを参考にしつつ、毎回cloneしなくて済むようにしました)。

#!/bin/bash -l
GIT_REPO=$HOME/repos/blog.git
GIT_CLONE=$HOME/repos/blog-build
PUBLIC_WWW=$HOME/html

cd $GIT_CLONE
git pull $GIT_REPO
bundle install --path vendor/bundler
bundle exec jekyll build --destination $PUBLIC_WWW
exit

GIT_REPOが本体みたいなbareリポジトリ、GIT_CLONEはそれを展開しておく場所(実際には都度cloneするんじゃなくpullしてますが)、PUBLIC_WWWがデプロイ先です。

なんとなく良さげですが、これでpushすると

fatal: Not a git repository: '.'

みたいなエラーが出ました。

何がいけないのか小一時間悩みましたが、上記エラーでググるとこのstackoverflowが出てきました。

次のようにunset GIT_DIRを挟むと動くようです。

#!/bin/bash -l
GIT_REPO=$HOME/repos/blog.git
GIT_CLONE=$HOME/repos/blog-build
PUBLIC_WWW=$HOME/html

cd $GIT_CLONE
unset GIT_DIR
git pull $GIT_REPO
bundle install --path vendor/bundler
bundle exec jekyll build --destination $PUBLIC_WWW
exit

原因は、gitは原則としてGIT_DIRをリポジトリの位置として扱っており、フォールバックとしてカレントディレクトリを使っているからなのだそう。

なので、unsetしてやって、カレントディレクトリを使わせるようにすれば良いということですね。

なんでGIT_DIRが使われるのかはよく理解できていませんが……