问题在哪里

当你使用 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 中手动部署 HexoVercel

Screenshot_2025-08-25_10-49-08

在 Github Action 中需要使用以下两个环境变量和一个秘钥:

  • VERCEL_ORG_ID
  • VERCEL_PROJECT_ID
  • VERCEL_TOKEN

获取Vercel Access Token

我们需要在 Vercel 中获取一段 Vercel Access Token 用于 Github Action 自动化部署。

点击直达Token创建页面

Screenshot_2025-08-25_10-50-35

获取 VERCEL_ORG_ID 和 VERCEL_PROJECT_ID的值

先安装vercel-cli

1
npm i -g vercel

然后在博客根目录下执行(如果博客目录下有 .vercel 文件夹记得删掉)

1
vercel link

来创建一个 Vercel 项目,此操作会在博客根目录下生成一个 .vercel 文件夹,在.vercel/project.json 里面包含了 VERCEL_ORG_IDVERCEL_PROJECT_ID

image-20250825111424687

在 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"字段
Screenshot_2025-08-25_10-54-04

填完了之后是这样的

Screenshot_2025-08-25_10-55-30

创建 Github Action

在博客创建 .github/workflows/deploy.yml 文件,写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
name: Deploy Blog to Vercel Production Deployment
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
# 0 indicates all history for all branches and tags.
fetch-depth: 0
- name: Restore file modification time 🕒
run: find source/_posts -name '*.md' | while read file; do touch -d "$(git log -1 --format="@%ct" "$file")" "$file"; done
# run: "git ls-files -z | while read -d '' path; do touch -d \"$(git log -1 --format=\"@%ct\" \"$path\")\" \"$path\"; done"
- name: Install Vercel-cli🔧
run: npm install --global vercel@latest
- name: Pull Vercel Environment Information
run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}
- name: Build Project Artifacts
run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}
- name: Deploy Project Artifacts to Vercel
run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}

推送你的博客

现在就大功告成啦~

使用 git push 把本地推送上去,Github Actions 会自动构建并推送到 Vercel

参考文章


共发表 36 篇Blog · 总计 29.7k 字
© 2025 AirTouch 使用 Stellar 创建
萌ICP备20250662号 雾备 88666688号 网ICP备20258888号
本站总访问量 次 本站总访客数 人 本文总阅读量