使用 Git 钩子和 Bash 脚本自动更新 Markdown 文件的 frontmatter
最后更新于
1 目录
2 情景
当你编写或更新 Markdown 文件时,通常需要手动更新 Front Matter 中的日期或其他元数据,以确保信息的准确性和完整性。这项任务可能会很繁琐,并且容易被遗忘或者忽略。
在这种情况下,自动化这项任务可能会帮助你提高工作效率和生产力。这篇随笔将为你介绍如何使用 Git 钩子和 Bash 脚本自动更新 Markdown 文件的 Front Matter。
Git 钩子是一些可配置的脚本,可以在 Git 命令执行之前或之后自动运行。你可以使用 Git 钩子来验证代码、运行测试、格式化代码、提交代码等操作。
3 准备
在使用本文中的脚本之前,需要安装 Git 和 Bash。
4 实现
4.1 Bash 脚本
新建文件 ./scripts/update-frontmatter.sh
#!/bin/bash
# 获取当前时间
DATE=$(date +"%Y-%m-%d %H:%M")
# 获取待提交的 Markdown 文件名
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.md$')
# 遍历每个待提交的 Markdown 文件并更新其 Front Matter
for FILE in $FILES; do
# 判断文件是否包含 Front Matter
if grep -q '^---' "$FILE"; then
# 使用 awk 在第二个 '---' 行之前的内容,匹配 'update' 字段
FRONT_MATTER=$(awk '/^---/{n++;next} n==2{exit} {print}' "$FILE")
if echo "$FRONT_MATTER" | grep -q 'update:'; then
# 更新 'update' 字段的时间戳
sed -i "0,/update:/s/\(update:\s*\).*/\1$DATE/" "$FILE"
else
# 如果 Front Matter 中不存在 'update' 字段,则在第一个 '---' 行之后添加
sed -i "0,/^---/{/^---/a update: $DATE
:b;n;bb}" "$FILE"
fi
else
# 如果文件没有 Front Matter,则在开头添加 Front Matter 和 'update' 字段
sed -i "1i---\nupdate: $DATE\n---\n" "$FILE"
fi
done
git add $FILES
exit 0
4.2 借助 husky 管理 Git 钩子
4.2.1 初始化
npx husky-init && npm install
4.2.2 配置钩子文件
编辑/新建 ./.husky/pre-commit 文件
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
echo -e "Updating Front Matter..."
./scripts/update-frontmatter.sh
echo -e "Front Matter updated."
5 完成
现在,我们就完成了 md 文件 frontmatter 自动更新的功能,并且实现了自动化处理。每次 Git 提交时,如果有 md 文件被修改,脚本就会自动更新 frontmatter 中的时间戳,不需要手动修改,省去了大量的时间和精力。
这个功能对于那些需要记录更新时间的项目非常有用,例如博客、文档等。