学习笔记 | Hugo自动修正文章最后修改时间的最佳方案
1024 字
5 分钟
学习笔记 | Hugo自动修正文章最后修改时间的最佳方案
Hugo 全自动修正文章修改时间的最佳实践(Serverless 场景)
在使用 Hugo 构建静态博客时,文章的修改时间(Last Modified Time) 是一个非常重要但又容易踩坑的问题,尤其是在 Serverless / CI 自动部署 场景下。
Hugo 官方目前提供了多种用于确定文章修改时间的方式:
Hugo 支持的修改时间来源
-
:filemodtime
使用文件本身的最后修改时间作为文章的修改时间。 -
lastmod
需要在文章 Front Matter 中手动维护lastmod字段。 -
:git
使用 Git 中该文件的最后一次提交时间作为修改时间(依赖gitinfo)。 -
date
使用文章的发布时间作为修改时间。
各方案的自动化可行性分析
在上述方案中:
-
✅ 可自动化
:filemodtime:git
-
❌ 不适合全自动
lastmod(需要人工维护)date(语义不符)
在 Serverless 场景下的问题
使用 Hugo 的一个重要原因,正是为了 方便地将网站部署到 Serverless 平台(如 Cloudflare Pages、Vercel、Netlify 等)。
然而在 Serverless / CI 场景中:
- 每次部署都会重新
git clone仓库 - 所有文件的 文件系统修改时间 都会变成「拉取时间」
- 这会导致:
- 所有文章的修改时间被错误地更新为“本次部署时间”
- 完全失去文章真实修改时间的意义
因此,:filemodtime 在默认情况下并不适合 Serverless 场景。
方案的现实问题
理论上,:git 是最理想的方案:
- 修改时间与 Git 提交严格一致
- 完全自动化
- 不依赖文件系统时间戳
但在实际使用中:
- 即使开启了
enableGitInfo = true - 某些情况下
:git无法正确生效 - 在 CI / Serverless 环境中尤为明显
不确定这是环境限制、Git shallow clone、还是 Hugo 本身的 Bug,但结果是:该方案在实践中不够稳定。
最终解决方案:修改文件时间戳为Git 提交时间 +
综合以上问题,我最终总结出了一套最适合 Serverless 管理的全自动方案:
核心思路
在 Hugo 构建之前,将文件的修改时间戳“伪装”为 Git 最后提交时间。
具体流程如下:
- Hugo 中使用
:filemodtime作为文章修改时间来源
[frontmatter]lastmod = [':fileModTime']- 将脚本放在文件夹根目录
- 将自动执行脚本的命令和正式部署命令合二为一(这里需要注意的是一般的serverless平台拉取项目只是浅层克隆不会把文件的最后提交信息给拉取过来,所以我们要在最前面要执行完整的拉取命令。)
git fetch --unshallow && chmod +x 1.sh && ./1.sh && hugo- Serverless平台设置环境变量TZ为Asia/Shanghai(不然的话,一般Serverless平台默认应该是美国的时间,会影响构建出来的网站的文章的最后修改日期的准确性)
这样就可以做到:
- ✅ 修改时间与 Git 提交时间一致
- ✅ 完全自动化
- ✅ 与 Serverless / CI 环境完美兼容
自动同步 Git 提交时间到文件修改时间的脚本
下面的脚本用于:
将当前目录下所有文件的最后修改时间,统一修改为对应的 Git 最后提交时间
# (此处放置你的脚本内容)#!/bin/bash# 功能:将 git 仓库中所有被追踪文件的修改时间改为最后一次提交时间
# 确保当前目录是 git 仓库if [ ! -d ".git" ]; then echo "Error: 当前目录不是 git 仓库根目录" exit 1fi
# 获取所有被追踪文件(包含特殊字符/空格/中文)git ls-files -z | while IFS= read -r -d '' file; do # 获取最后一次提交的 Unix 时间戳 timestamp=$(git log -1 --format="%ct" -- "$file")
if [ -n "$timestamp" ]; then # 使用 touch 修改文件修改时间 # -d "@$timestamp" 表示从 Unix 时间戳设置时间 touch -d "@$timestamp" "$file" echo "Updated: $file -> $(date -d "@$timestamp" '+%Y-%m-%d %H:%M:%S')" else echo "Skipped (not tracked): $file" fidone
echo "All tracked files' modification times updated."文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
学习笔记 | Hugo自动修正文章最后修改时间的最佳方案
https://blog.liao-ke.com/posts/hugo-add-lastmod-to-posts/相关文章智能推荐
1
方案分析 | 博客框架的选择
方案分析从静态博客与动态博客的架构差异出发,对资源占用、部署方式、运维成本与可扩展性做对比,并给出 WordPress/Typecho/Halo 与 Hexo/Hugo/Jekyll/Astro 等常见框架的选择建议。
2
学习笔记 | 最简单的绕过校园网多设备热点检测方案
学习笔记通过 tun 虚拟网卡与网络共享手动指定热点上级网卡,绕过校园网热点设备数检测
3
随笔杂谈 | Waline用户列表加载失败
随笔杂谈记录一次 Waline 评论系统用户列表接口返回 500 的排查与修复过程,问题最终定位在 avatar 服务的字段名不匹配。
4
学习笔记 | openwrt25.10设置vlan实现单线复用
学习笔记通过在光猫、主路由与房间子路由三端统一配置vlanid,实现桥接模式下的单线复用,让光猫其他网口/房间网口也能正常获取主路由DHCP下发的IP,并给出openwrt25.10的配置步骤与注意事项。
5
学习笔记 | GKI 内核不完全编译实战
学习笔记以 GKI 5.10+ 为例,记录 Android 内核“不完全编译”的完整流程:环境依赖、编译链选择、编译命令到 AnyKernel3 打包刷入,并附常见坑与排查思路。
随机文章随机推荐

