解決 Hexo 在 CI 環境中文章更新日期被更動問題

在使用 CI 工具自動產生 Hexo 靜態網站時,發現在每次重新觸發建置流程後,文章的更新日期(post.updated)都會被更新,連沒有變動的文章也會。
原因是沒有在 front-matter 設定 updated 屬性的文章,Hexo 會以檔案的最後修改日期作為 post.updated 的值,而在 CI 建置環境中,每次觸發建置流程都會重新 git clone,檔案的最後修改日期也會是 git clone 時的日期。

解決的方法有兩種:

  1. 在每篇文章的 front-matter 都加上 updated 屬性。
  2. 在每次 hexo generate 前「還原」檔案的最後修改日期。

但作法 1 的工程耗大,而且容易修改文章後忘了同時修改 updated 屬性,所以如果可以取得檔案正確的修改日期,作法 2 應該較為可行。
那麼要從哪取得檔案正確的修改日期呢?用檔案最後 git commit 的時間目前看來是最簡便也很符合需求。

在建置流程加入如下指令:

1
git ls-files --directory source | while read path; do touch -d "$(git log -1 --format='@%ct' $path)" "$path"; done

簡單來說就是從 git log 中取得每個檔案的最後 commit 時間,透過 touch 設定檔案的最後修改日期,而因為只會影響文章(post)及頁面(page)的更新日期,所以只要處理 source 目錄中的檔案即可。