ruby trunk changes を git notes で閲覧する方法 2022版

最初に説明抜きで結論を

CRuby のリポジトリを git で clone した working copy で以下を実行します。

git remote add ruby-trunk-changes https://github.com/nagachika/ruby.git
git config --local remote.ruby-trunk-changes.fetch '+refs/notes/commits:refs/notes/ruby-trunk-changes'
git config --local notes.displayRef '*'
git fetch ruby-trunk-changes

git の使いかたにはいろいろ個人の好みがあったりとか既存の設定との相性があると思うので、よりこまかく設定したい人や背景を知りたい人は以下の説明も読んでみてください。

背景

毎日 CRuby のコミットのコメントを書く ruby trunk changes は、ご覧の通り現在ははてなブログで公開しています。しかしこのコメントのプライマリな保存先は、はてなブログの記事ではなく git notes という機能を利用して notes として保存されており、GitHub 上のわたしの fork である https://github.com/nagachika/ruby に push されています。

過去の経緯としてはまず k-tsj さんが ruby-trunk-changesをgitから参照する - 継続にっき(2011-12-12) に git notes としてコメントを閲覧する方法について紹介してくださり過去の記事も git notes の形式で保存したリポジトリを公開してくださいました。
この記事を拝見して ruby trunk changes の記事の保存形式として git notes をプライマリにしたいなと思って書いた記事が git notes をボトムアップから理解する - ruby trunk changes です。この頃にはメモを書くためのツールを Heroku にデプロイして PostgreSQL にメモを一時的に保存していましたが、永続化のためにはどこか別のストレージに置きたいと思っていたので git notes をその候補として、メモツールから直接 notes として push できないかなと考えて内部構造を調べたのが先の「git notes をボトムアップから理解する」です。
その後メモツールは何度かバージョンアップや移植を経て、いつからか忘れてしまいましたが現在では git notes をプライマリのストレージとするようになっています*1

従って特定のコミットの ruby trunk changes のメモを閲覧するためには、はてなブログを検索するかわりに皆さんの手元の rubyリポジトリで notes として閲覧することも可能です。稀にではありますが遠い過去のコメントを修正することがあり、その際にも修正されるのはまず git notes のコメントであり、はてなブログ上の記事の修正が漏れている可能性はあるのでこちらのほうがオリジナルデータと言えます*2

しかし [ruby trunk changes git notes] とかで Google 検索しても先頭にヒットするのは先の k-tsj さんの記事やわたしの「ボトムアップから理解する」の記事だけであって、現時点で ruby trunk changes を git で閲覧するためにどうセットアップするのがいいかという情報はその時々に口承されているという状況であったので、記事を書いて検索結果にヒットするようにしようと思いました。

以下の説明には暗黙のうちに git の設定方法の選択や内部構造に依存する語彙などが含まれているのですが、その説明は割愛しています。詳しくはドキュメントや書籍を参照してください。 先に挙げた git notes をボトムアップから理解する - ruby trunk changes およびそこからリンクしている「Gitをボトムアップから理解する 」という翻訳記事も参考になると思います。

ruby trunk changes を含む notes のセットアップ

まず GitHub から https://github.com/ruby/ruby.git を clone します。既に手元に clone した working copy があれば不要です。

git clone https://github.com/ruby/ruby.git

手元の git では単に clone しただけでは notes の情報は fetch されません。しかしこれは git の設定に依存する可能性もあると思います。場合によっては ruby/rubyリポジトリに存在している notes の情報が refs に追加されているかもしれません。

git notes サブコマンドのヘルプメッセージをみるとわかるように git notes サブコマンドは全て "--ref" というオプションをつけることができます。つまりひとつのリポジトリの変更履歴に異なる種類の notes をつけることができるようになっています。
このうち "refs/notes/commits" という ref (--ref オプションでは refs/notes/ の部分を省略して commtis と指定することもできます) が git notes サブコマンドがデフォルトで参照する ref です*3
ruby trunk changes のプライマリストレージを notes に移行した時には rubyリポジトリは notes 情報を利用していなかったのですが、その後 ChangeLogリポジトリ内で管理するのをやめてリリースパッケージ作成時にコミットログから自動的に生成するように変更したため、コミットログの間違いを訂正するという目的で github.com/ruby/ruby の notes (より正確に言うと refs/notes/commits という git notes のデフォルトの ref)が利用されるようになっています。

従って ruby trunk changes を参照するための notes はこの ref とは別の名前にしておいたほうが無難です*4

ここでは ruby-trunk-changes という名前の ref で fetch するようにするコマンドを示します。

git remote add ruby-trunk-changes https://github.com/nagachika/ruby.git
git config --local remote.ruby-trunk-changes.fetch '+refs/notes/commits:refs/notes/ruby-trunk-changes'

以上の設定で ruby-trunk-changes という remote から git fetch すると git notes を取得するようになります。

git fetch ruby-trunk-changes
git notes --ref ruby-trunk-changes list

上記のコマンドで謎の hash 値が 2つ並んだ大量の出力が得られたら完了しています。

試しに 3.2.0 の開発開始を知らせる狼煙である Matz のコミットにつけたコメントを git notes show コマンドで閲覧してみます。

$ git notes --ref=ruby-trunk-changes show 81c248924daf387118de5b37b16e08a937df73a3
include/ruby/version.h の RUBY_API_VERSION_MINOR が 2 に更新されました。 開発版が 3.2.0 となりました。

このように表示されれば ruby trunk changes のコメントを git notes として取得できています。

あとはたまに git fetch ruby-trunk-changes を実行するとコメントが notes に追加されていきます。

git log で閲覧するための設定

git notes の情報が clone されたリポジトリ(working copy) に fetch されて git notes コマンドで閲覧できるようになりましたが、 git log や git show でコミットを閲覧する時にも notes をみることができると便利です。
以下の git config コマンドを実行すると自動的に全ての refs の notes がログと同時に表示されるようになります。ちなみに git config の場合の '*' のところのクオートは必要なので注意(ないと shell によってワイルドカードとしてファイル名に展開されてしまいます)。 '*' のかわりに ruby-trunk-changes だけにしてもいいのですが、将来的に別の notes を利用するようになった時にそれも表示できたほうがいいと思うのでワイルドカード指定を例示しています。

git config --local notes.displayRef '*'

ここではリポジトリの working copy 単位で設定しましたが、ホームディレクトリの ~/.gitconfig に設定して他のリポジトリでも git notes の情報を閲覧するようにすることもできるのでそのあたりはお好みに。

これにより git show コマンドでコミットログや差分と一緒に ruby trunk changes のコメントが表示されるようになったので、先ほどの Matz のコミットをみてみます。

→ git show 81c248924daf387118de5b37b16e08a937df73a3
commit 81c248924daf387118de5b37b16e08a937df73a3
Author: Yukihiro "Matz" Matsumoto <matz@ruby.or.jp>
Date:   Sat Dec 25 23:56:01 2021 +0900

    Development of 3.1.0 started.

Notes (ruby-trunk-changes):
    include/ruby/version.h の RUBY_API_VERSION_MINOR が 2 に更新されました。 開発版が 3.2.0 となりました。

diff --git a/include/ruby/version.h b/include/ruby/version.h
index 104f78a0c6..f10b58f9c7 100644
--- a/include/ruby/version.h
+++ b/include/ruby/version.h
@@ -67,7 +67,7 @@
  * Minor  version.   As of  writing  this  version changes  annually.   Greater
  * version doesn't mean "better"; they just mean years passed.
  */
-#define RUBY_API_VERSION_MINOR 1
+#define RUBY_API_VERSION_MINOR 2

 /**
  * Teeny version.  This digit  is kind of reserved these days.   Kept 0 for the

コミットログで 3.1.0 とバージョン番号を間違っているのに惑わされずにちゃんと 3.2.0 とコメントできていることがわかりますね。

それではよい ruby 開発を。

*1:ただし当初構想していたようなメモツールから直接 git リポジトリを操作する方法ではなく、はてなブログへの投稿後まとめて手元から push するようなワークフローになっています

*2:公開直後に誤りの指摘を受けて修正する際などはほぼ確実にはてなブログも修正していますが

*3:しかしこの notes がデフォルトで参照する ref も設定で変更できるので、手元の環境で既に設定されていたら違っているかもしれません

*4:わたし自身は手元では refs/notes/commits を使い続けているのですが……