雑記: Github Actions の Checkout はデフォルトでシャロ―クローンというだけ

参考文献

  1. GitHub Actions で変更があるときだけ git commit & push する(2022年5月9日参照).
  2. continuous integration - Git history in a Github Action - Stack Overflow(2022年5月9日参照).
  3. GitHub - actions/checkout: Action for checking out a repo(2022年5月9日参照).



GitHub Pages で Web ページをつくると思います。そうなるとどのページの最終更新日がいつというのを一覧表示したくなると思います。なので各ページの最終更新日を取得する create_index.sh をかきます(以下)。

cookipedia/create_index.sh at 8739615ed113341aefd690efc123d880478ed43c · CookieBox26/cookipedia · GitHub

コミット前に create_index.sh を実行すると意図通り全ページの最終更新日がトップページに反映されます(以下)。

Cookipedia

しかし、create_index.sh を手動で実行するのではなく、GitHub に push したら勝手に「create_index.sh を実行し」「適宜 commit する」とやってほしいと思います。なので GitHub Actions にこれをやらせます。リポジトリに以下のワークフロー定義ファイルを配置します(以下)。[1] を参考にしました。

cookipedia/action.yml at 8739615ed113341aefd690efc123d880478ed43c · CookieBox26/cookipedia · GitHub

そうすると push をトリガーに「create_index.sh を実行し」「適宜 commit する」とやってくれ……やってくれてはいるのですが、なぜか全ページの最終更新日が今日になってしまいます(以下)。

Update · CookieBox26/cookipedia@690a1bc · GitHub

この原因は以下(のはず)です。

  • create_index.sh は各ファイルの最終更新日を git log コマンドから取得している。
  • 他方、ワークフローで利用している actions/checkout@v3 は、明示的に fetch-depth を指定しなければ直近の commit 履歴しか clone しない [2] [3]。ので、git log コマンドで直近 1 件の commit しか参照できない。要するに、git log コマンドで各ファイルの真の最終コミット日を取得できない。

なので、ワークフロー定義ファイルで fetch-depth: 0(すべてのコミット履歴を取得)とすればいいはずです。ここまで調べておいてなんですが、コミットが増えるのでやっぱり create_index.sh は手動で実行したいと思います。


ちなみにコレスキー分解の記事は最終更新日が 4 月 10 日ですが、手元でリポジトリを普通に clone すれば以下のコマンドでこの日付を取得できます。

$ git clone https://github.com/CookieBox26/cookipedia.git
$ cd cookipedia/
$ git log -1 --format="%ad" --date=short ./articles/cholesky_decomposition.html
2022-04-10

しかし、--depth=1 で clone するとリポジトリへの一番最近のコミットでこのファイルがつくられた感じになります。

$ git clone https://github.com/CookieBox26/cookipedia.git --depth=1
$ cd cookipedia/
$ git log -1 --format="%ad" --date=short ./articles/cholesky_decomposition.html
2022-05-09