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

30

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

5个回答

37

10
让我们给这个答案点赞,并收藏那个项目,直到GitHub将该插件添加到白名单中。 - Ciro Santilli OurBigBook.com
1
我在安装jekyll-last-modified-at时遇到了问题。我尝试了gem update、gem install、bundle exec、bundle install,并尝试在config.yml中包含gem,但我无法解决这个“依赖错误:糟糕!看起来你没有jekyll-last-modified-at....”我使用Github,所以如果它不在白名单中,那对我来说也不好;-) - Athanassios

17

从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 }}

不幸的是,这对我不起作用,因为page.path为空。我找到了一篇文章,展示了如何访问它,但这似乎只适用于帖子而不适用于其他页面。 - Robert
嗯...这很奇怪,我在页面上精确使用它,看起来运行良好。如果有影响的话,我正在使用jekyll(1.1.2)和ruby(2.0.0p247)。 - Juan A. Navarro
没有设置page.path的脚本,我会得到Liquid error: can't convert nil into String。使用它,我会得到'generate': undefined method 'name'。我正在使用ruby 1.9.3和Jekyll 0.11.2,更新起来并不容易... - Robert
1
嗯,是的,除非您升级到一些Jekyll 1.x版本,否则这将很困难。抱歉。 - Juan A. Navarro
1
只是要补充一点:如果像我一样,将您的网站源代码移动到子目录中,您需要在来自page.path的路径前加上该目录(它只与源相关),示例如下:{{ page.path | prepend: "/" | prepend: site.source | file_date | date_to_string }} - tamouse
显示剩余3条评论

8

根据krlmlr的帖子,我编写了一个pre-commit脚本,用于更新修改文件的YAML front matter中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:字段来表示创建时间。


使用 gh-pages 进行 wfm!我不得不在 _layouts 中的 docpage.html 中添加 {% unless page.nodate %} {{ page.date | date: "%b %-d, %Y" }}{% endunless %},并在每个文件的 front matter 中添加 date:。真是一个很好的圣诞礼物,能够找到这个方法。 - catpaws
1
运行得非常好!我改变的唯一一件事是日期格式。我正在使用 date "+%Y-%m-%d %T %z",它与(当前)默认的Jekyll日期格式相匹配。 - Sebastián Barschkis

4

如果你使用Git,你可以安装一个pre-commit hook来自动更新修改文件的front matter中的日期字段。我很惊讶地发现,pre-commit hook确实可以改变提交的内容!你只需要在每个克隆的仓库中手动安装pre-commit hook--以下草稿对于我来说用来更新整个网站的总体修改时间:

#!/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)-我没有时间实现这一点,但如果最终出现更好的解决方案,我会有兴趣了解。

4
我认为不使用YAML前置元数据是不可能完成这个任务的。然而,请注意,在前置元数据中指定“date”实际上会覆盖帖子文件名中给出的“date”。
因此,如果你有一个文件“2013-02-19-my-post.md”,并且在它的前置元数据中有“date: 2013-02-20”,则前置元数据优先,并且文章的日期是“2013-02-20”。
如果您想跟踪帖子何时被修改,恐怕没有办法不使用前置元数据中的自定义字段。称其为“modified-date”或其他名称。是的,这有点繁琐。我有一个TextExpander片段,可以自动输出正确格式的当前日期/时间,非常方便。

这是否适用于帖子或一般情况?对于帖子,我不认为有必要获取它们的修改日期,因为文件名中编码的日期已经足够了(我很少更改帖子)。但是,对于Jekyll正在处理的所有其他Markdown文件,我没有那个日期并将其编码在YAML frontmatter中。由于这些文件经常更改,我希望能自动获取它们的修改日期。 - Robert
1
您描述的功能在Jekyll中没有内置,无论是在文章还是页面中都没有。我想理论上您可以编写一个Jekyll插件,它利用Ruby的File.mtime,但这似乎比它值得的麻烦多了。此外,可能会产生一些意想不到的后果。例如,如果您想编辑页面的frontmatter而不更新其修改日期怎么办?我认为自定义变量是最好的选择。 - Andrew Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接