2017年7月18日火曜日

Git Date Expansion

Webページの最終更新日時を手動で更新するのはやや面倒だしたまに忘れることがあるので自動化したいです。Gitで管理している場合であればattributeを使って自動で更新されるように設定することができます。Gitのattributeについては説明を省くので適宜 Pro Git book 等を参照してください。

さて、今回の要件は次のようになります。

  • Webページ中にLast modified 2017-01-23のような行を保持したい
  • そのような行は最後に更新したときの日時(更新時のdate +%F で得られる値)になるようにしたい
    • amendなどを行なうとGitのコミットに書いてある日時とは異なる点に注意
  • 最終更新日時の情報はcommitされて欲しいがworking treeでは更新されない

まず、htmlファイルに対して"dater"というfilterが適用されるように、.gitattributesに次の内容を書きます。

*.html filter=dater

次にメインの処理内容を書きます。以下の内容を.git/configに追記すれば良いです。working treeからstageされる際にcleanが適用されるので$Last modified$Last modified: $(date +%F)に更新されます。逆にstageの内容をworking treeに戻す際にLast modified:から始まる行を$Last modified$に置換します。これによってworking treeでは最終更新日時の情報は更新されないようになります。

[filter "dater"]
        clean = sed 's/\\$Last modified\\$/Last modified: '$(date +%F)'/'
        smudge = sed 's/\\(Last modified\\):[^<]*/$&$/'

最後に最終更新日時を記述したいファイルに$Last modified$という行を追加することで目標が達成できます。