如何在Jekyll中显示文件的修改日期?

时间:2013-02-20 11:14:54

标签: date jekyll liquid

我知道我可以在文件的YAML前端中指定变量date,并使用{{ page.date }}访问其值。这很麻烦,因为在更新文件时很容易忘记更改日期。那么如何访问文件的修改日期呢?

5 个答案:

答案 0 :(得分:29)

这是一个相对较新的插件,可以满足您的需求:

https://github.com/gjtorikian/jekyll-last-modified-at

(在Google搜索此线程中其他答案的替代方法时找到了它)

答案 1 :(得分:16)

来自Jekyll 1.x,有一个page.path,它为您提供当前正在处理的帖子或页面的文件名。添加以下过滤器(例如放在_plugins/myfilters.rb中)以获取给定文件名的修改时间:

module Jekyll
  module MyFilters
    def file_date(input)
      File.mtime(input)
    end
  end
end

Liquid::Template.register_filter(Jekyll::MyFilters)

现在,您可以在帖子和页面上呈现日期,例如

{{ page.path | file_date | date_to_string }}

答案 2 :(得分:8)

根据krlmlr的帖子,我写了一个预提交脚本来更新修改文件的YAML前端date:字段的修改时间。

#!/bin/sh
# Contents of .git/hooks/pre-commit

git diff --cached --name-status | grep "^M" | while read a b; do
  cat $b | sed "/---.*/,/---.*/s/^date:.*$/date: $(date -u "+%Y-%m-%d %T %Z")/" > tmp
  mv tmp $b
  git add $b
done

这对我来说很好。我实际上使用update:字段来指示修改时间,并使用date:字段来指示创建时间。

答案 3 :(得分:4)

我不认为不使用YAML前端就可以做到这一点。但请注意,在frontmatter中指定date实际上会覆盖帖子文件名中给出的date

因此,如果您有一个文件2013-02-19-my-post.md,并且在其前缀中有date: 2013-02-20,则前缀优先,帖子的日期为2013-02-20

如果您想要跟踪修改帖子的时间,我担心如果不使用前端中的自定义字段,则无法执行此操作。称之为modified-date或其他什么。是的,这有点乏味。我有一个TextExpander代码段,它以适当的格式自动输出当前日期/时间,这很方便。

答案 4 :(得分:4)

如果你正在使用Git,你可以安装一个预提交钩子,它自动更新修改文件前面的日期字段。我很惊讶地发现预提交钩子确实可以改变提交的内容!您只需在存储库的每个克隆中手动安装预提交挂钩 - 以下粗略草稿可用于更新整个网站的整体修改时间:

#!/bin/sh
# Contents of .git/hooks/pre-commit

set -e
set -x

sed -i "s/^date:.*$/date: $(TZ=UTC date "+%Y-%m-%d %H:%M:%S %Z")/" _config.yml
git add _config.yml

_config.yml应该有一个字段“date”,其内容将被每个提交替换。然后可以通过{{ site.date }}访问它。例如:

date: 2015-04-10 10:51:37 UTC

可以推广脚本以仅更新那些已更改的页面或帖子(通过git diff-index --cached查询) - 我没有时间实现这一点但我有兴趣了解是否更整洁解决方案最终会弹出。