雪山深处

GitHub Actions 下恢复文件时间戳

GitHub Actions 下恢复文件时间戳

2023 年 03 月 02 日 • 2 分钟

技术

我感觉这是我最短的文章。

我博客的所有“技术”类文章底部都添加了一个标签,用来提醒读者这篇文章最后更新的时间以做参考(本文末尾也会有一个)。正好前段时间我把构建和部署都交给了 GitHub Actions,今天发现这些标签的日期全都变成了打包那天的日期。这是因为这些数据是通过 Markdown 文件的时间戳计算而来的,而 Git 重新拉取(GitHub Actions 每次打包前都会做的事)都会创建新的文件,时间戳也就会变成当天。

在 Linux 下恢复这些时间戳只需要一行指令:

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

它会遍历仓库下的文件,根据文件的 commit 记录获取时间戳,并把这个赋值给文件自身的 ctime、mtime(创建时间、修改时间)。

为了在 GitHub Actions 下生效,将 yml 文件修改一下即可:

jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
+       with:
+         fetch-depth: 0
+
+     - name: Restore file timestamps
+       run: git ls-files | while read file; do touch -d $(git log -1 --format="@%ct" "$file") "$file"; done

这里给 actions/checkout 加个 fetch-depth: 0 配置是因为 checkout 默认下只会拉取一个 commit 而不是完整的 commit 记录,这会影响我们的操作,把这个配置加上就能拉取整个仓库的记录了,当然速度也就会慢一些。

嗯,就是样!我们下篇废文再见~

本文最后于2023 年 03 月 02 日更新,一些操作可能已经过时