CHANGELOGからgitコミットログを自動生成する
2018-11-10
Tech最近はどのプロジェクトもCHANGELOG.mdを書くようにしているのだが、CHANGELOGとコミットログは基本的に同じ内容になるので、手間を省くために自動で記入するようにしてみた。
手順
以下を.git/hooks/prepare-commit-msgという名前で保存してchmod +xする。
#!/usr/bin/env ruby
CHANGELOG_PATH = "./CHANGELOG.md"
exit unless File.exist?(CHANGELOG_PATH)
log = `git diff --cached -U0 '#{CHANGELOG_PATH}'`
headers = log.lines.drop_while{|l| l !~ /^@@/}.drop(1)
header = headers.map{|l| l[3..-1]}.join
commit_msg_path = ARGV[0]
File.write(commit_msg_path, header + File.read(commit_msg_path))
例
CHANGELOGに以下のdiffがあるとする。
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cfecb17..d78bbbf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# HEAD
+- foo: bar
- change: Remove DnD support on mobile devices (was not so useful)
# v0.3.3 (2018-11-07)
この状態でgit add CHANGELOG.mdしてgit commitすると、以下のようにコミットメッセージが自動記入された状態でエディタが立ち上がる。
foo: bar
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# ...
解説
.git/hooks以下にprepare-commit-msgという実行ファイルを置くと、git commit時にエディタが起動したときの内容をカスタマイズすることができる。やり方は第一引数で渡されたファイル名を加工するだけなので簡単。ここではgit diffコマンドの出力から変更部分だけを切り出している。-U0
(--unified=0
)を付けると変更された行しか出力されないので整形しやすかった。