【发布时间】:2013-02-05 08:57:05
【问题描述】:
我知道我可以在文件的 YAML frontmatter 中指定变量 date 并使用 {{ page.date }} 访问它的值。这很麻烦,因为人们很容易忘记更改文件更新的日期。那么如何获取文件的修改日期呢?
【问题讨论】:
我知道我可以在文件的 YAML frontmatter 中指定变量 date 并使用 {{ page.date }} 访问它的值。这很麻烦,因为人们很容易忘记更改文件更新的日期。那么如何获取文件的修改日期呢?
【问题讨论】:
根据 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:字段表示创建时间。
【讨论】:
date "+%Y-%m-%d %T %z"。
如果您使用的是 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 查询)——我没有时间实现这一点,但我有兴趣了解是否会出现更简洁的解决方案终于出来了。
【讨论】:
这是一个相对较新的插件,可以满足您的需求:
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 }}
【讨论】:
page.path 是空的。我发现a post 显示了如何访问它,但这似乎仅适用于帖子,不适用于其他页面。
page.path 的脚本我得到Liquid error: can't convert nil into String。使用它我得到'generate': undefined method 'name'。我正在使用 ruby 1.9.3 和 Jekyll 0.11.2,而且更新起来并不容易......
page.path 的路径之前(它只是源相对路径),例如所以:{{ page.path | prepend: "/" | prepend: site.source | file_date | date_to_string }}
我认为不使用 YAML frontmatter 是不可能做到这一点的。但是请注意,在 frontmatter 中指定 date 实际上会覆盖帖子文件名中给出的 date。
因此,如果您有一个文件 2013-02-19-my-post.md 并且在它的frontmatter 中有date: 2013-02-20,那么frontmatter 优先,并且帖子的日期是2013-02-20。
如果您想跟踪帖子何时被修改,恐怕没有在您的frontmatter 中使用自定义字段的情况下无法做到这一点。称它为modified-date 或其他名称。是的,这有点乏味。我有一个 TextExpander sn-p 可以自动以正确的格式输出当前日期/时间,这很方便。
【讨论】:
File.mtime,但这似乎比它的价值更麻烦。另外,可能会有一些意想不到的后果。例如,如果您想在不更新其修改日期的情况下编辑页面的前端内容怎么办?我认为自定义变量是最好的方法。