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
相关产品推荐
相关产品推荐

