Gitでコード管理してる自作ソフトをDebianパッケージにしたいとき、標準的な構成を自動生成できないかと考えました。標準的な構成とは何か、ですが、/usr/share/doc/(パッケージ名)の下にNEWS, ChangeLog, copyrightがあるくらいでしょうか(色々見た限りでは決まりは無いようで、単なる慣習だろうと思います)。copyrightは自分で用意してやるほかありませんが、ChangeLogはgit logコマンドで適当に作れそうだな、と思ったのが事の始まりです。
実際、そのような趣旨の記事やQ&Aページは沢山見つかります。下記はそのほんの一部。
ところがDebianパッケージのChangeLogを調べると、多くは次の書式を採用しています。
パッケージ名 (バージョン番号) stable/unstable/それに類する単語; urgency=low/medium/high
* 更新内容の説明
-- 作業者名 <メールアドレス> 曜日, 日 月 年 時刻 +GMT
前述の記事たちに、このような書式に整形する内容はありませんでした。
Gitでコード管理しているなら、
- パッケージ名=リポジトリ名 … basename `pwd` すればOK
- 更新内容の説明 … git logのコミットメッセージそのまま
- 作業者名 … git config --listからuser.nameを取ってくればOK
- メールアドレス … 同じくuser.emailを取ってくればOK
- 日時 … 上のページたちにあるようにgit logに--prettyだの--decorateだのつければなんとかなる
んですが、バージョン番号やstable/unstable、urgencyなどはGitで管理してません。
残念でした、おしまい、とするのは何だかなので、背景をもう少し調べてみました。そもそもChangeLogとはどういうものなのか。
上記のページは大変参考になります。これらによれば、
- git commitはコードの差分を端的に言語化するもので、説明的であってはならない
- ChangeLogは開発者間のコミュニケーションの拠り所とするものなので、説明的でなければならない
のがそれぞれの趣旨である、と。相容れません。
もう一つ、ChangeLogでは
- Mention whether you follow Semantic Versioning.
とされていて、気持ちとしてはSemantic Versioningに従うことを推奨されている雰囲気があります。
Semantic Versioningについては↓をご参照下さい。
一方、Gitの哲学では(完全に理解しているわけではありませんが、恐らく)コード管理するのに明示的なバージョン番号は不要、という考え方があります。これも相容れません。
ですから正しいやり方は、Git logからChangeLogを作るのではなくChangeLogを先に書き、それに基づいてGit操作する、具体的には、
- ChangeLogに非説明的な見出しを付けて、それを抽出してコミットメッセージにする
- Semantic Versioningに基づいてバージョン番号を自分で付け、それをコミットのタグにする
- stable/unstableはブランチを分ける
- urgencyはSemantic Versioningと整合するように自分で決める(Gitに明示的情報として残すのは諦める)
ということになろうかと思います。こちらはある程度自動化できそうです。
異論・反論・反証を歓迎します。調べが足りない部分もあろうと思いますので。