问题在哪里
当你使用 Vercel 自动化部署 Hexo 博客时会发现,每次 git push
都会导致文章更新时间变为此次提交修改时间,然而实际上文章并没有进行任何修改。
这个问题是由于 git
在推送更新时不会保存文件创建和修改时间等文件元数据。
所以当你每次使用 git clone
上传或下载的项目的文件元数据都是当前系统时间,而不是项目的创建时间。
而在 Hexo 中,文章默认会使用 文件的最后修改时间 作为文章的更新时间,所以CI构建之后进入博客就会看到所有文章修改时间都会变为“刚刚”或者”X分钟以前“这种地狱绘图,因为 git push
上去的文件不会保存元数据。
怎么修复
这里只提供一个很有效但稍有些麻烦的方法(但也没找到更简单的方法),同时也是本站正在使用的方法
由于每次更新推送后 Vercel 都会自动构建部署,我们无法对构建流程进行修改,因此需要关闭 Vercel 的自动构建,转而使用 Github Action来将Hexo 自动化部署到 Vercel。
实现原理
在Next主题issue #893 中@wylu提到了这个问题,@sli1989 提出了以下解决方案
Hi, the updated time with CI deployment can be fixed using this. please check Continuous Integration configurations carefully.
1
2 ># Restore last modified time
- "git ls-files -z | while read -d '' path; do touch -d \"$(git log -1 --format=\"@%ct\" \"$path\")\" \"$path\"; done"
该条命令会将文件的最后修改时间修改为 Git 仓库中文件的最后提交时间,即文章的更新时间。
同样使用 find
命令也可以实现这个功能:
1 | find source/_posts -name '*.md' | while read file; do touch -d "$(git log -1 --format="@%ct" "$file")" "$file"; done |
准备工作
首先,将 Vercel 项目 与 Github 仓库 的绑定关系解除,因为我们将要在 Github Action 中手动部署 Hexo 到 Vercel。

在 Github Action 中需要使用以下两个环境变量和一个秘钥:
- VERCEL_ORG_ID
- VERCEL_PROJECT_ID
- VERCEL_TOKEN
获取Vercel Access Token
我们需要在 Vercel 中获取一段 Vercel Access Token 用于 Github Action 自动化部署。

获取 VERCEL_ORG_ID 和 VERCEL_PROJECT_ID的值
先安装vercel-cli
1 | npm i -g vercel |
然后在博客根目录下执行(如果博客目录下有 .vercel
文件夹记得删掉)
1 | vercel link |
来创建一个 Vercel 项目,此操作会在博客根目录下生成一个 .vercel
文件夹,在.vercel/project.json
里面包含了 VERCEL_ORG_ID
和 VERCEL_PROJECT_ID
。

在 Github 仓库中添加 secrets
在你的博客所在的 Github 仓库中,点击 Settings
-> Secrets and Variables
-> Actions
中添加以下秘钥和环境变量:
- VERCEL_TOKEN ——前面创建的Vercel Access Token
- VERCEL_ORG_ID ——
.vercel/project.json
中的"orgId"
字段 - VERCEL_PROJECT_ID ——
.vercel/project.json
中的"projectId"
字段

填完了之后是这样的

创建 Github Action
在博客创建 .github/workflows/deploy.yml
文件,写入以下内容
1 | name: Deploy Blog to Vercel Production Deployment |
推送你的博客
现在就大功告成啦~
使用 git push
把本地推送上去,Github Actions 会自动构建并推送到 Vercel