我知道我可以date
在文件的 YAML frontmatter 中指定一个变量并使用{{ page.date }}
. 这很麻烦,因为人们很容易忘记更改文件更新的日期。那么如何访问文件的修改日期呢?
5 回答
这是一个相对较新的插件,可以满足您的需求:
https://github.com/gjtorikian/jekyll-last-modified-at
(在谷歌搜索该线程中其他答案的替代品时找到了它)
从 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 }}
根据 krlmlr 的帖子,我编写了一个 pre-commit 脚本来更新date:
已修改文件的 YAML front matter 中字段的修改时间。
#!/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:
field来表示修改时间,用date:
field来表示创建时间。
I don't think it's possible to do this without using the YAML frontmatter. Note, however, that specifying date
in the frontmatter actually overrides the date
given in the post's filename.
So if you have a file 2013-02-19-my-post.md
and in its frontmatter you have date: 2013-02-20
, the frontmatter takes precedence, and the post's date is 2013-02-20
.
If you want to keep track of when a post is modified, I'm afraid there's no way to do this without using a custom field in your frontmatter. Call it modified-date
or something. Yes, it is a bit tedious. I have a TextExpander snippet that automatically outputs current date/time in the proper format, which is handy.
如果您使用的是 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
会有一个字段“日期”,其内容将被每次提交替换。然后可以通过 访问它{{ site.date }}
。例子:
date: 2015-04-10 10:51:37 UTC
该脚本可以概括为仅更新那些已更改的页面或帖子(通过查询git diff-index --cached
)——我没有时间实现这一点,但我有兴趣了解最终是否会出现更简洁的解决方案。