如何在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片段,可以自动输出当前日期/时间格式,这很方便。
从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'是空的。我发现[一个帖子](http://stackoverflow.com/questions/13243469/how-can-a-jekyll-page-access-its-filename),显示如何访问它,但这似乎只适用于帖子和不适用于其他页面。 – Robert 2013-08-19 10:48:55
嗯..这很奇怪,我正是在页面上使用它,它似乎工作正常。万一它很重要,我使用jekyll(1.1.2)和ruby(2.0.0p247)。 – 2013-08-19 14:30:21
如果没有设置'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到本线程中的其他答案)
让我们upvote这个答案和明星项目,直到GitHub将该插件添加到白名单。 – 2014-11-26 11:12:11
我在安装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:
字段来指示创建时间。
使用gh-pages的wfm!必须添加{%除非page.nodate%} {{page.date | date:“%b%-d,%Y”}} {%endunless%}添加到我在_layouts中的docpage.html中,并将日期:添加到每个文件的前端。这是多么好的圣诞礼物。 – catpaws 2015-12-24 23:13:13
工程就像一个魅力!唯一改变的是日期格式。我正在使用'date'+%Y-%m-%d%T%z“',它匹配(当前)默认的Jekyll日期格式。 – 2016-04-22 09:54:27
帖子或一般不可能吗?对于文章,我没有看到需要得到他们的修改日期,因为在文件名编码的日期是好的(我很少改变职位)。但是,对于Jekyll正在处理的所有其他Markdown文件,我没有该日期并将其编码在YAML frontmatter中。由于这些文件经常变化,我想自动获取它们的修改日期。 – Robert 2013-02-21 08:23:42
您描述的功能不是内置于Jekyll中,无论是帖子还是页面。我想理论上你可以编写一个[Jekyll插件](https://github.com/mojombo/jekyll/wiki/Plugins),它利用了Ruby的'File.mtime',但是这看起来更麻烦而不值得。另外,可能会有一些意想不到的后果。例如,如果你想编辑一个页面的frontmatter而不更新其修改日期呢?我认为自定义变量是最好的选择。 – 2013-02-22 03:12:28