本文章能帮你实现仅在Obsidian里,完成从写作、部署到发布的全流程。如果你使用Obsidian + Hexo + Git&Netlify&Vercel这种类型的工作流,这将对你十分受用
1. 编写脚本
编写一键发布脚本
将如下代码粘贴进记事本,并且重命名成DeployBlog.bat
这样的批处理文件,最好保存在你博客的根目录下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @echo off :: 下面替换成你的博客项目地址如:D:\Projects\LeavesBlog cd /d "你博客的项目地址" setlocal :: 获取年、月、日 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a" set "year=%dt:~0,4%" set "month=%dt:~4,2%" set "day=%dt:~6,2%" :: 获取小时、分钟、秒 set "hour=%dt:~8,2%" set "minute=%dt:~10,2%" set "second=%dt:~12,2%" :: 构建日期字符串 set "DATE=%year%-%month%-%day% %hour%:%minute%:%second%" :: 执行Hexo生成和Git命令 hexo g && git add . && git commit -m "ArticlePublish[%DATE%]" && git push endlocal pause
|
编写一键预览脚本
同样的逻辑,这次我将编写好的文本文档保存为LocalServer.bat
。命令里只用到了一个hexo s
,那是因为我们在obsidian里只会改动到.md文件,而这种文档,hexo是会实时更新的(只需浏览器里刷新网页就能查看变动)
1 2 3
| @echo off cd "D:\Projects\LeavesBlog" && start http://localhost:4000 && hexo s pause
|
2. 将脚本嵌入Obsidian
我们先在Obsidian里新建一个Markdown
文档,我这里命名为shortcuts.md
,最好放在根目录下。
由于在Obsidian里可以使用![]()
来插入文件,所以可以这样写:
![一键发布](DeployBlog.bat)
![一键预览](LocalServer.bat)
前提是你Obsidian的仓库地址必须和博客的项目地址相同。
圆括号里可以用相对路径,但是貌似用不了绝对路径,因为一用绝对路径它会把链接当成图像来处理。 最终效果如下:
如此一来,以后我们写完Obsidian文章,就无需再开启IDE或者开终端去打指令了,那样做割裂感太强,一点也不优雅。以后我们直接在Obsidian里点击那个按钮就行。
3. 编写计划任务
如果你连那个按钮都懒得点,只想专注于写作的话,那给Windows添加一个计划任务,使其每次检测到Obsidian关闭时,自动执行Deploy.bat
那个脚本就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
| from git import Repo from datetime import datetime import os import re import subprocess import sys def format_commit_message(message): """ 格式化commit消息 如果消息格式为"ArticlePublish[yyyy-mm-dd HH:MM:SS]", 则转换为"于[yyyy-mm-dd HH:MM:SS]更新了文章" """ pattern = r"ArticlePublish\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]" match = re.match(pattern, message.strip()) if match: timestamp = match.group(1) return f"于[{timestamp}]更新了文章" return message.strip() def write_header(file): """ 写入文章头部内容 """ header = '''--- title: 叶子的Blog网站更新日志 date: 2024-11-10 04:00:00 updated: tags: - 日志 - 建站 - 运维 permalink: Gitlog excerpt: 💡该文档能帮助你知道 我的Blog网站 的任何更新情况,无论是新增功能、文章更新还是bug修复。内容由 Python 脚本根据我的 Git 记录自动生成💡 cover: https://ybkjzj.com:5555/d/webImage/%E8%88%AA%E5%A4%A9%20%E5%9C%B0%E7%90%83%20%E8%88%AA%E6%8B%8D%E7%85%A7%E7%89%87%204k%E9%A3%8E%E6%99%AF%E5%A3%81%E7%BA%B8_%E5%BD%BC%E5%B2%B8%E5%9B%BE%E7%BD%91.jpg comment: true categories: --- {% note primary fa-regular fa-robot %} 该文是我编写的`Python`脚本根据我的`Git`记录**动态生成**的。 {% endnote %} > 💡该文档能帮助你知道 我的Blog网站 的**任何更新**情况,无论是新增功能、文章更新还是bug修复。 > 💡你可以把它理解为我整个网站的**更新日志**。如此以来,我最近对我的网站做了什么,有没有发布新文章便都一目了然了。 \n\n\n---\n''' file.write(header) def get_commit_history(repo_path, output_file): """ 读取git仓库的commit历史并输出为markdown格式 Parameters: repo_path (str): git仓库的本地路径 output_file (str): 输出markdown文件的路径 """ try: repo = Repo(repo_path) commits = list(repo.iter_commits('main')) with open(output_file, 'w', encoding='utf-8') as f: write_header(f) for commit in commits: commit_time = datetime.fromtimestamp(commit.committed_date).strftime('%Y-%m-%d %H:%M:%S') files_changed = [] try: for parent in commit.parents: diff = parent.diff(commit) files_changed.extend([d.a_path for d in diff]) except: pass formatted_message = format_commit_message(commit.message) github_url = f"https://github.com/LeavesWebber/LeavesBlog/commit/{commit.hexsha}" f.write(f'---\n') f.write(f'### 🔄 版本号: [{commit.hexsha[:8]}]({github_url})\n\n') f.write(f'**发布者:** 三葉Leaves <{commit.author.email}>\n\n') f.write(f'**更新日期:** {commit_time}\n\n') f.write('{% note blue fa-bolt %}#### ' + formatted_message + '{% endnote %} \n') f.write(f' \n') f.write(f'---\n') print(f'Commit history has been exported to {output_file}') except Exception as e: print(f'Error: {str(e)}') def execute_commands(repo_path, commit_message): """ 执行Hexo和Git命令 """ my_env = os.environ.copy() my_env["LANG"] = "zh_CN.UTF-8" commands = [ 'hexo clean', 'hexo g', 'hexo d', 'git add .', f'git commit -m "{commit_message.encode("utf-8").decode("utf-8")}"', 'git push' ] try: os.chdir(repo_path) for cmd in commands: print(f'执行命令: {cmd}') process = subprocess.Popen( cmd, shell=True, env=my_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', errors='ignore' ) stdout, stderr = process.communicate() if process.returncode == 0: print(f'{cmd} 执行成功') if stdout: print(stdout) else: print(f'{cmd} 执行失败') if stderr: print(stderr) except Exception as e: print(f'发生错误: {str(e)}')
if __name__ == '__main__': if len(sys.argv) != 2: print('使用方法: python3 publish.py "commit消息"') sys.exit(1) try: commit_message = sys.argv[1].encode('utf-8').decode('utf-8') except UnicodeError: try: commit_message = sys.argv[1].encode('gbk').decode('utf-8') except UnicodeError: commit_message = sys.argv[1] repo_path = r"D:\Projects\LeavesBlog" output_file = r"D:\Projects\LeavesBlog\source\_posts\Blog建站\叶子的Blog网站更新日志.md" get_commit_history(repo_path, output_file) execute_commands(repo_path, commit_message)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @echo off chcp 65001 cd /d "D:\Projects\LeavesBlog" setlocal :: 获取年、月、日 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a" set "year=%dt:~0,4%" set "month=%dt:~4,2%" set "day=%dt:~6,2%" :: 获取小时、分钟、秒 set "hour=%dt:~8,2%" set "minute=%dt:~10,2%" set "second=%dt:~12,2%" :: 构建日期字符串 set "DATE=%year%-%month%-%day% %hour%:%minute%:%second%" :: 执行Python脚本 python.exe publish.py "于[%DATE%]更新了文章" endlocal pause
|