You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jekyll按最后修改日期排序文章遇Git覆盖问题求解决方案

解决Jekyll Git部署后文章最后修改日期显示异常的问题

你碰到的这个问题本质是Git的特性导致的:当你通过Git克隆或部署代码时,Git会把所有文件的**文件系统修改时间(mtime)**重置为当前Git操作的时间(比如提交时间或克隆时间),而不是文件实际最后编辑的时间。这就导致你原来依赖File.mtime的代码在Git部署环境下失效了。

下面是具体的解决方案,核心思路是从Git的提交历史中提取每个文章的最后修改时间,而不是依赖文件系统的时间:

1. 修改Jekyll Hook代码,从Git获取修改时间

替换你原来的Hook代码为以下内容:

Jekyll::Hooks.register :posts, :pre_render do |post|
  # 优先使用文章Front Matter中手动指定的最后修改日期
  unless post.data['last-modified-date']
    # 通过Git命令获取当前文件最后一次提交的时间(ISO格式)
    git_last_modified = `git log -1 --format="%ad" --date=iso "#{post.path}"`.strip
    if !git_last_modified.empty?
      # 解析Git返回的时间字符串为DateTime对象
      post.data['last-modified-date'] = DateTime.parse(git_last_modified)
    else
      # 当Git不可用时,回退到文件系统的修改时间(比如本地无Git环境的情况)
      post.data['last-modified-date'] = File.mtime(post.path)
    end
  end
end

代码说明:

  • 增加了手动指定日期的优先级:如果你想给某篇文章自定义最后修改日期,直接在文章的Front Matter里写last-modified-date: 2024-05-20 14:30:00即可,代码会优先使用这个值。
  • 使用git log命令精准获取文件的最后提交时间:git log -1 --format="%ad" --date=iso <文件路径>会返回该文件最后一次被Git提交的时间,格式为ISO标准时间,方便Jekyll解析。
  • 保留了回退机制:如果部署环境中没有Git(比如特殊情况),还是会用文件系统的mtime作为备选。

2. 确保部署环境的Git配置正确

有些部署工具为了加快速度,会使用git clone --depth 1进行浅克隆,这种方式会丢失大部分Git历史记录,导致git log无法获取到文件的最后提交时间。你需要:

  • 调整部署脚本,使用完整的Git克隆(去掉--depth 1参数)。
  • 如果必须使用浅克隆,至少要设置足够的深度(比如--depth 100),确保能覆盖所有文章的提交历史。

3. 测试验证

  • 本地测试:修改一篇文章,提交到Git,运行Jekyll服务,检查文章的最后修改日期是否为本次提交的时间。
  • 部署测试:将代码通过Git部署到主机,查看所有文章的最后修改日期是否对应各自的最后提交时间,而不是统一的部署时间。

这样就能在保留Git版本控制的前提下,正确显示每篇文章的最后修改日期了。

内容的提问来源于stack exchange,提问作者Fraktar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:09