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

问题描述:

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

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

所以,如果你有一个文件2013-02-19-my-post.md,并在它的frontmatter你有date: 2013-02-20,frontmatter优先,帖子的日期是2013-02-20

如果你想跟踪帖子被修改的时间,恐怕没有办法做到这一点,没有在你的frontmatter中使用自定义字段。叫它modified-date什么的。是的,这有点乏味。我有一个TextExpander片段,可以自动输出当前日期/时间格式,这很方便。

+0

帖子或一般不可能吗?对于文章,我没有看到需要得到他们的修改日期,因为在文件名编码的日期是好的(我很少改变职位)。但是,对于Jekyll正在处理的所有其他Markdown文件,我没有该日期并将其编码在YAML frontmatter中。由于这些文件经常变化,我想自动获取它们的修改日期。 – Robert 2013-02-21 08:23:42

+1

您描述的功能不是内置于Jekyll中,无论是帖子还是页面。我想理论上你可以编写一个[Jekyll插件](https://github.com/mojombo/jekyll/wiki/Plugins),它利用了Ruby的'File.mtime',但是这看起来更麻烦而不值得。另外,可能会有一些意想不到的后果。例如,如果你想编辑一个页面的frontmatter而不更新其修改日期呢?我认为自定义变量是最好的选择。 – 2013-02-22 03:12:28

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

不幸的是,这对我不起作用,因为'page.path'是空的。我发现[一个帖子](http://stackoverflow.com/questions/13243469/how-can-a-jekyll-page-access-its-filename),显示如何访问它,但这似乎只适用于帖子和不适用于其他页面。 – Robert 2013-08-19 10:48:55

+0

嗯..这很奇怪,我正是在页面上使用它,它似乎工作正常。万一它很重要,我使用jekyll(1.1.2)和ruby(2.0.0p247)。 – 2013-08-19 14:30:21

+0

如果没有设置'page.path'的脚本,我会得到'Liquid error:无法将nil转换为String'。使用它我得到''生成':未定义的方法'名称'。我使用的是Ruby 1.9.3和Jekyll 0.11.2,并且更新并不那么容易...... – Robert 2013-08-21 18:31:09

这是一个相对较新的插件,做你在找什么:

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

(发现而alternat谷歌搜索ives到本线程中的其他答案)

+6

让我们upvote这个答案和明星项目,直到GitHub将该插件添加到白名单。 – 2014-11-26 11:12:11

+1

我在安装jekyll-last-modified-at时遇到了问题。我试过gem update,gem install,bundle exec,bundle install,并试图在我的config.yml中包含gem,但我无法解决这个“依赖错误:哎呀!看起来你没有jekyll-last-modified -at ....“我使用Github,所以如果这没有被列入白名单,那么对我来说它不是好的;-) – Athanassios 2016-07-30 12:24:39

如果你使用Git,你可以安装一个预先提交的钩子,自动更新修改后的文件的前面的日期字段。我很惊讶得知pre-commit钩子确实可以改变提交的内容!你只需要手动安装一个pre-commit钩子到库中的每个克隆 - 工程以下的草稿,我更新了整个网站的整体修改时间:

#!/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预计将有一个字段“日期”,其内容将被每个提交所替换。它可以通过{{ site.date }}访问。例如:

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

该脚本可以被推广到仅更新已(通过git diff-index --cached查询)改变这些网页的帖子 - 我没有实现这个时间,但我很想学习,如果整洁的解决方案最终会弹出。

根据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:字段来指示创建时间。

+0

使用gh-pages的wfm!必须添加{%除非page.nodate%} {{page.date | date:“%b%-d,%Y”}} {%endunless%}添加到我在_layouts中的docpage.html中,并将日期:添加到每个文件的前端。这是多么好的圣诞礼物。 – catpaws 2015-12-24 23:13:13

+1

工程就像一个魅力!唯一改变的是日期格式。我正在使用'date'+%Y-%m-%d%T%z“',它匹配(当前)默认的Jekyll日期格式。 – 2016-04-22 09:54:27