考察とは名ばかりで感想?

最近は主にプログラミング(AIコーディング)と資産運用(FXで食ってくぞ!)

スクリプトで記事のプッシュとコミットを一気に!――はてなブログのローカル管理術

前回、はてなブログをローカルのマークダウンファイルとして管理する方法を説明しました

kurutto115.hatenablog.com

これでAIに記事を編集させるのも簡単になりましたが、それだけでなくgitでバージョン管理したりもできるんです! が、おかげでコマンドラインでの作業が手間になってきました。そこで投稿・更新・バージョン管理といった一連の作業をコマンド一発で完了させる、自作のPowerShellスクリプトを作成したのでご紹介します

gitで記事を管理する

はてなブログの記事を管理するために、バージョン管理システムのgitを使っています。変更履歴を記録することでいつどんな修正をしたのかが明確になり、過去の状態に戻すのも簡単になります

gitとは

gitはファイルの変更履歴を記録・追跡するための「バージョン管理システム」です。元々はプログラムのソースコードを管理するために開発されましたが、マークダウンで書かれたブログ記事もテキストファイルであるため、同じように管理することができます

gitの利点

  • 変更履歴の保存: いつ、誰が、どの部分を修正したのかを記録できます
  • 過去のバージョンへの復元: 「やっぱり前の内容に戻したい」と思ったときに、簡単に特定の時点の状態に戻せます
  • 差分の確認: 前回の保存状態からどこが変わったのかを明確に確認できます

gitの使い方

gitには多くの機能がありますが、ブログ記事の管理に使うのは主に以下の2つのコマンドライン操作だけです

ステージング: コミット(変更の記録)に含めたいファイルを選択します

git add <ファイル名>

コミット: ステージングしたファイルの変更を、変更内容を説明するメッセージ付きでリポジトリ(変更履歴の記録)に保存します

git commit -m "コミットメッセージ"

基本的にはこの繰り返しです。変更履歴の確認など、より複雑な操作はGUIツールを使えば直感的に行えます。自分はCursor(AI連携機能付きエディタ)に内蔵されたツールと拡張機能を使っています

また、ブログの記事についてはパソコン上のローカルリポジトリだけで運用しています。GitHubなどでネットワーク上にリモートリポジトリを作ることもできますが、ブログサービス自体がリモートリポジトリのような役割を果たしてくれますし、ファイルのバックアップは既にクラウドストレージで行っているからです

スクリプトでblogsyncを使いやすくする

blogsyncのおさらい

blogsyncは、はてなブログの記事をローカルのファイルと同期するためのコマンドラインツールです。記事をパソコンにダウンロードして手元のエディタで編集したり、ローカルで作成した記事をはてなブログに投稿・更新したりできます

主なコマンドには、記事をダウンロードするpull、更新するpush、新規投稿するpostなどがあります。記事のタイトルやカテゴリといったメタデータは、ファイル冒頭に記載されるYAMLフロントマターで管理されます。これにより、gitでのバージョン管理やAIツールとの連携が容易になります

スクリプトを作った理由

そんな頼りになるblogsyncですが、少々面倒なところがありまして

  1. blogsyncのコマンドが手間
    • いちいちフォルダ名入力せずにblogsync push <ファイル名>.mdで済ませたい!(というのはターミナルをそこのフォルダで開いてりゃ良いんですが
    • postがもうややこしいんです。元のファイル名、カスタムパス、記事タイトル、下書きの指定、ブログのドメイン名を全部書く必要がある!
  2. gitも一気にやりたい
    • blogsyncとgitの片方やってもう片方忘れちゃったりするんですよね
    • それといちいちステージングするのが面倒(ブログは普通ファイル1つコミットすればそれで済むので…)

そこでスクリプトを作って作業を効率化できるようにしました。作成したスクリプトblog.ps1は、blogsyncとgitの操作をまとめて実行するためのPowerShellスクリプトです。これによりコマンド入力の手間を減らし、操作のし忘れを防ぎます

スクリプトの使い方と機能

PowerShellのターミナルで、blog.ps1ファイルがあるフォルダ(リポジトリのルート)において以下のようにスクリプトを実行します

.\blog.ps1 <コマンド> [引数...]

(Obsidianでターミナルを開いてコマンドを実行した様子)

コマンドには以下のようなものがあり、ブログの投稿から更新、削除まで一連の作業を簡単に行うことができます

コマンド 引数 説明
post <file_name> <title> 新しい記事を下書き状態で投稿します。ルートフォルダの<file_name>.mdを元にblogsync postを実行し、entryフォルダに移動してコミットします
push <file_name> <message> <title> entryフォルダ内の記事をblogsync pushで更新し、変更をコミットします
fetch <file_name> <message> <title> entryフォルダ内の記事をblogsync fetchでリモートから取得し、変更をコミットします
remove <file_name> <title> entryフォルダ内の記事をblogsync removeで削除し、git rmでリポジトリからも削除してコミットします
edit <file_name> <message> <title> entryフォルダ内の公開済み記事の変更を、blogsyncは実行せずgitにのみコミットします。ブログに反映しない段階の下書きを記録することができます
save <file_name> <message> <title> ルートフォルダにあるローカル限定ファイル(ブログに投稿しないメモなど)の変更をgitにのみコミットします。blogsyncは実行しません
help なし このスクリプトのヘルプメッセージを表示します。

コマンド実行例

公開済みの記事を更新する: entry/2025/kabu-diary.mdを編集した後、以下のコマンドを実行します

.\blog.ps1 push kabu-diary "資産残高を更新" "脱サラ高等遊民の投資日記2025<其の弐>改"

するとスクリプトによって以下のコマンドが実行され、ブログに変更が反映されると共に変更内容がコミットされます

blogsync push .\entry\2025\kabu-diary.md
git add .\entry\2025\kabu-diary.md
git commit -m "資産残高を更新" -m "" -m "脱サラ高等遊民の投資日記2025<其の弐>改"

コミットメッセージについて: このスクリプトでgitにコミットする際、メッセージは以下のような3行形式で統一されます

1行目: 変更内容の要約(<message>引数で指定)
2行目: (空行)
3行目: 記事のタイトル(<title>引数で指定)

これはgitの一般的なコミットメッセージの書き方に沿ったものです。1行目で何をしたかを簡潔に示し、3行目以降で詳細(この場合はどの記事か)を説明します*1。これにより、後から履歴を見返したときに変更内容が分かりやすくなります

新しい記事を投稿する: ルートフォルダにnew-article.mdというファイルを作成した後、以下のコマンドを実行します

.\blog.ps1 post new-article "新しい記事のタイトル"

するとスクリプトによって以下のコマンドが実行されます。ファイルはentry/2025/new-article.mdに移動し、タイトルや下書き指定などのメタデータが書き加えられた上でコミットされます

Get-Content .\new-article.md | blogsync post --custom-path=2025/new-article --title="新しい記事のタイトル" --draft kurutto115.hatenablog.com
git rm .\new-article.md
git add .\entry\2025\new-article.md
git commit -m "投稿" -m "" -m "新しい記事のタイトル"

ローカルのメモを保存する: ブログに投稿しないscript-commands.mdを編集した後、以下のコマンドを実行します

.\blog.ps1 save script-commands "メッセージの例を修正" "blogsync用コマンド入力例"

以下のコマンドにより変更内容がコミットされます。blogsyncは実行されません

git add .\script-commands.md
git commit -m "メッセージの例を修正" -m "" -m "blogsync用コマンド入力例"

設計上の工夫

スクリプトには誤操作防止として、対象ファイルが前回のコミットから変更されていない場合、pushを中止する機能を実装しています。これによりfetchするはずが誤ってpushしてしまい、ブラウザ上で加えた変更が消滅する事故を防ぐことができます。逆にfetchを実行する際は前回のコミットから変更が無いか確認し、変更がある場合はfetchを中止します

また、post実行時にはpushよりも引数が少ないことによる入力ミスが懸念されため、各コマンドには引数の数が間違っている場合に実行を中止する機能があります。更に、ファイルを移動するときは前のコミットから余計な変更が無ければ履歴を引き継げるので、元のファイルに変更が加えられている場合もpostの実行を中止する機能を備えています

スクリプトの中身を大公開!

このスクリプトは1ファイルで完結してるシンプルなものなので、せっかくだからここに全部載せちゃいます!*2 必要であれば(自己責任で)バンバン使っちゃってください*3

(追記)スクリプトを↑から少々修正したので、記事にしました。コミットメッセージの書き方をちょっと変えてます

kurutto115.hatenablog.com

*1:スクリプトの仕組み上タイトル以外も書けるので、普通に詳細をガッツリ書いたりもできます。自分は記事タイトルと一緒に追記箇所の見出しも書いたりします

*2:公開用に一部改変しています

*3:定数のフォルダパスとブログURLは書き換えて使ってください