現在の ruby では ChangeLog ファイルはバージョン管理対象には入れず、 tarball 生成時に make ChangeLog (相当) で作成するようになっています。 その時にgit-notesを使って多少の修正が できる仕組みが入っています。

ChangeLog 生成部分

git log --format=medium --notes=commits --notes=log-fix --topo-order --no-merges --date=iso-local のような感じで notes 込みで git log を参照して、 ChangeLog を生成しています。

このとき、 log-fix

31s/fileter/filter/
33s/infomation/information/

のように 行番号s/置換前/置換後/ と書いておけば置換が実行されます。

log-fix への commit

make ChangeLog から typo などをみつけたなら、 その上の commit 8655c2e69041cc812d30c2e951a8ac9ea7a60c47 の行をみたり、 コミットログをみつけてみつけたりしたら、 git show 8655c2e69041cc812d30c2e951a8ac9ea7a60c47 などで対象のコミットかどうか確認します。

対象のコミットが確認できたら、たとえば git notes --ref=log-fix edit 8655c2e69041cc812d30c2e951a8ac9ea7a60c47 で置換を記入します。

変更確認

make ChangeLog で反映されているのを確認します。

手元だけの変更があるときは、以下のように git fetch[rejected] と出るのが正常です。

% make ChangeLog
Generating ChangeLog
From git.ruby-lang.org:ruby
 ! [rejected]              refs/notes/log-fix -> refs/notes/log-fix  (non-fast-forward)

make ChangeLog で反映されているのを確認して、 うまくいっていなかったら、 git notes --ref=log-fix edit 8655c2e69041cc812d30c2e951a8ac9ea7a60c47 で置換を修正します。

commit の squash

このまま push しても問題はないのですが、 試行錯誤の途中は不要なので、 最終結果だけ残します。

慣れないブランチで壊してしまうと面倒なので、 ここではシンプルにコミットし直しで squash します。

最終結果だけ別の場所にコピーして残しておいて、

git fetch origin +refs/notes/log-fix:refs/notes/log-fix

でいったん refs/notes/log-fix ブランチを元に戻します。 + をつけているのは force push のように現在の変更を無視して上書きするという意味です。

git notes --ref=log-fix edit 8655c2e69041cc812d30c2e951a8ac9ea7a60c47 で最終的な置換を設定し直して、 また make ChangeLog で確認します。

git push

最後に git push して完了です。

% git push origin refs/notes/log-fix:refs/notes/log-fix
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 401 bytes | 401.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote: To git@github.com:ruby/ruby.git
remote:    550d488..7457a63  7457a630f3a6fc08d2ada667349f06fe91156961 -> refs/notes/log-fix
To git.ruby-lang.org:ruby.git
   550d488713..7457a630f3  refs/notes/log-fix -> refs/notes/log-fix

まとめ

ruby の ChangeLog 生成に入っている log-fix の仕組みを紹介しました。

git-notes は一時期 GitHub の Web 上でも表示されていたのに、 表示されなくなってしまったので、 使いどころが難しそうですが、 ruby では他に pull request をマージしたときに元の pull request の URL を記録するのにも使っていたりします。

特殊なブランチなので、 pull request などを受け付けるのも難しそうなので、 コミッター以外からの contribution を受け付けたいと思ったら、 どうすればいいのかはよくわかりませんでした。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published