Jekyll部署至GitHub Pages后File.mtime显示提交时间而非修改时间
问题解决:Jekyll本地显示正确最后修改日期,GitHub Pages显示提交时间
核心原因
你的问题大概率是GitHub Pages自动构建覆盖了本地构建结果,或是File.mtime依赖本地文件系统时间导致跨环境不一致:
- 若你将GitHub Pages源设置为master分支,GitHub会在服务器上重新运行Jekyll构建,此时
File.mtime读取的是文件在Git仓库中的最后提交时间(而非本地修改时间)。 - 若你用pre-push钩子推送静态文件到gh-pages分支,但未正确配置GitHub Pages源,GitHub仍会自动构建,导致日期被替换。
解决方案
1. 修正GitHub Pages配置
- 进入仓库Settings → Pages页面
- 将Source设置为
gh-pages分支,路径选择/(root) - 确保未启用GitHub Actions自动构建(若有),避免覆盖本地构建的静态文件
2. 确保pre-push钩子正常执行
- 给钩子添加执行权限:
chmod +x .git/hooks/pre-push - 手动执行钩子验证流程:在master分支运行
.git/hooks/pre-push,切换到gh-pages分支查看静态文件的HTML源码,确认last_modified_date是本地修改时间
3. 替换为Git提交记录获取时间(更可靠)
File.mtime依赖本地文件系统,跨环境易出问题,改用Git提交历史获取最后修改时间,本地和线上结果一致:
修改你的Jekyll钩子代码为:
Jekyll::Hooks.register :site, :pre_render do |site| site.collections['notes'].docs.each do |note| # 获取文件最后一次Git提交的时间 last_commit_time = `git log -1 --format="%ad" --date=iso "#{note.path}"`.strip unless last_commit_time.empty? note.data['last_modified_date'] = DateTime.parse(last_commit_time) end end end
4. 禁用GitHub自动构建(可选)
若需用master分支托管静态文件,在仓库根目录创建.nojekyll文件,让GitHub跳过Jekyll自动构建,直接托管静态内容。
内容的提问来源于stack exchange,提问作者krarpit
相关产品推荐
相关产品推荐

