Git pre-commitフックでFrontmatterの「更新日時」を自動更新する

今までブログ記事コンテンツの「更新日時」はgitの履歴情報を元にしていました。 たとえば、Hugoの場合はenableGitInfo = trueとすると、Gitの履歴情報からMarkdownの最終更新日時を自動で取得してlastmodとして割り当てられていました。

しかし、GitHub ActionsでHugoのビルドを行う際に、全履歴を取得するのをやめたことで、Markdownlastmodの項目を見るように変更しています。

今後はlastmodをメンテナンスする必要があるため、いちいち「更新日時」を手動更新するのではなく、gitpre-commitフックを利用して更新日時を自動更新する方法を調べました。

Git hooksとは

git hooksとは特定のアクションが発生した時に、カスタムスクリプトを実行する方法を指します。

git hooksは、クライアントサイドとサーバーサイドの2つに分類できます。

クライアントサイドのコミット時フック(コミットプロセスに関する)には主な4つがあります。

  • pre-commit
    • コミットメッセージが入力される前に実行
  • prepare-commit-msg
    • コミットメッセージエディターが起動する直前、デフォルトメッセージが生成された直後に実行
  • commit-msg
    • コミットメッセージを保存した一時ファイルへのパスをパラメータに取る
  • post-commit
    • コミットプロセスが全て完了した後に実行

今回はpre-commitフックを利用して、対象のMarkdownファイルをCommitした際に、更新日時を自動的に更新させます。

pre-commit shell script

次のShell Script.git/hooks/pre-commitとして作成して、chmod +xなどで実行権限を付与します。 あとは、git commitコマンドを実行した際には、自動的にlastmodが更新されるようになります。

 #!/bin/sh
 
 # Read YAML front matter in all the modified files for committing,
 # and replace "lastmod:" line to "lastmod: current date and time"
 
 git diff --cached --name-status | grep "^M" | while read a b; do
   cat $b | sed "/---.*/,/---.*/s/^lastmod:.*$/lastmod: $(TZ=Asia/Tokyo date "+%Y-%m-%dT%T")+09:00/" > tmp
   mv tmp $b
   git add $b
 done

Windowsの場合

ファイル先頭が#!/bin/shだとerror: cannot spawn .git/hooks/pre-commit: No such file or directoryというエラーが発生しました。 #!/bin/bashに変更することで動作することを確認しました。

#!/bin/bash 

git diff --cached --name-status | grep "^M" | while read a b; do
  cat $b | sed "/---.*/,/---.*/s/^lastmod:.*$/lastmod: $(TZ=Asia/Tokyo date "+%Y-%m-%dT%T")+09:00/" > tmp
  mv tmp $b
  git add $b
done

参考

まとめ

面倒でついつい更新をサボってしまうような処理は自動化するのがよいですね。 今回このスクリプトを用意したことで、今後は意識せずとも更新日時が更新されるようになります。

参考

Backlinks

静的サイトジェネレータHugo
Hugo入門 静的サイトジェネレータ「Hugo」でシンプルブログサイトを構築する 静的サイトジェネレータ「Hugo」インストール 静的サイトジェネレータ「Hugo」〜公開方法〜 サイト構築 Hugoのテーマでsubmoduleを使う方法 HugoでのシンタックスハイライトにPython Pygmentsが不要となった HugoのRelated Contentを利用して関連記事を表示する gulpで画像の最適化 Hugoソースコードリーディング〜Taxonomy〜 Render Hooks for Code Blocksを利用してコードブロックにファイル名を表示する Hugoでブログカードを作成する(resources.GetRemote利用) Templates 【Hugo】Partial Templateでは複数returnを記述する早期Returnを使えない 【Hugo】images.TextでOGP画像を生成する Shortcodes Hugo Shortcodesの作り方 HugoのShortcodesを利用してAmazon紹介リンクタグを作成 HugoでAMP対応のブログカードを作る AMP対応 AMP向けのミニマルCSSフレームワーク「1BX」をHugoに導入した AMPページの最適化〜ぼくのAMPサイトがこんなに遅い訳がない〜 AMP OptimizerによるAMPのさらなる最適化 AMP Service WorkerでPrefetch Linksを実現する Data Driven Content Hugoで人気記事を表示するためJSONを返すAPIサーバを作りData-driven Contentを試してみた Tailwind CSS HugoでTailwindCSSを利用しAMP Validなページを生成する ビルド npm-run-allでローカルAPI serverとHugo serverを同時に実行する GitHub Actionsのスケジューラ実行を利用して定期的にビルドする Circle CIでHugoのビルド・デプロイを実行する コンテンツ作成 Git pre-commitフックでFrontmatterの「更新日時」を自動更新する Hugoでブログ記事一覧ページ(ブログアーカイブページ)を作成する 移行 はてなダイアリーからはてなブログ経由で独自ドメインのブログに記事を移行しました JekyllからHugoへの移行ポイント Hugoで生成した静的サイトのホスト先をさくらVPSからNetlifyに変更する 書籍
2017-12-31