Coding持续集成
当使用自动化部署时,发现部署成功后,所有文章的更新时间都变成了此次提交修改的时间,但有些文章在上一次提交后是没有发生过任何修改的。

这是因为git在推送更新时,并不记录保存文件的访问时间、修改时间等元信息,(原因在这里)所以每次使用git把项目clone下来时,文件的时间都是克隆时的时间。又因为如果没有在front-matter中指定updated,Hexo会默认使用文件的最后修改时间作为文章的更新时间,所以会出现所有文章的更新时间都发生变化的情况。

总的来说,使用git clone下来的文件的时间都不是原来文件的时间,而自动化部署每次都需要clone源码才能进行后面的生成和部署操作,所以目前如果想正确显示更新时间。需要:

方法一:使用 updated 属性字段

在文章中的front-matter中添加updated: 更新时间项

1
2
3
4
5
title: 修复 CI 构建博客造成的更新时间错误
author: Sea
toc: true
date: 2021-01-07 15:53:16
updated: 2021-01-07 15:53:16

以后修改文件的话也只需修改updated项对应日期即可,但是这样有个弊端,完全需要靠自己自觉去修改更新时间,自己一旦忘掉,那么更新时间的意义也就荡然无存了,因此这里推荐第二种方法。

方法二:使用 git 推送时间

添加以下步骤:

1.解决文件名中文时导致无法正确读取日志

在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。将git配置文件 core.quotepath项设置为false。quotepath表示引用路径,加上–global表示全局配置

git config --global core.quotepath false

添加前
20220220140109
添加后
20220220140322

  1. 将 clone 下来的文件的时间改成了该文件最近一次变动的推送时间

git ls-files --directory source | while read path; do touch -d "$(git log -1 --format=\'@%ct\' $path)" "$path"; done

Jenkinsfile步骤

1
2
3
4
5
6
7
stage('解决使用CI时,文章更新时间出现问题') {
steps {
echo "git中文处理"
sh 'git config --global core.quotepath false'
sh 'git ls-files --directory source | while read path; do touch -d "$(git log -1 --format=\'@%ct\' $path)" "$path"; done'
}
}