Skip to content

GitでChange-Idを自動付与する方法

This content is a draft and will not be included in production builds.

GerritのChange-Idとは何かで何者なのかをまとめたが、ここでは Change-Id をどうやって付与するのかを書く。

公式フックスクリプトをダウンロード

Section titled “公式フックスクリプトをダウンロード”

Gerrit公式でGitのフックスクリプトを配布しているが、これはGerritをインストールしたサーバから落とす必要がある。一般的にGerritサーバを持っていないと思うので、公開されているGerritサーバを参照するといい。例えばGoやAndroidが使えるかもしれない。以下ではGoの例を示す。

Terminal window
curl -O https://go-review.googlesource.com/tools/hooks/commit-msg

上記でダウンロードした commit-msg をそのまま .git/hooks に置いても良いのだが、Git 2.54からは用途別にフックを置けるようになっているので、それを使うと良いだろう。

Terminal window
mv commit-msg ~/bin/git-hook-new

~/.config/git/config でスクリプトを参照する。enabled パラメータはデフォルトで true なので無くても良い。Git 2.55からは parallel パラメータが増えるそうだけど、今の時点ではまだ存在しない。

[hook "new"]
event = commit-msg
command = ~/bin/git-hook-new
enabled = true

ここでは管理しやすさのために git-hook- プリフィックスを付けているけれど、命名規則は無いのでなんでもいい。

Gerrit Code Review - Change-Idsを参考に、実際の開発で行うことを調べる。

作業をはじめるとき、これまで通り新しいブランチを作成して、そこで開発を行う。変更が終わったら git commit でコミットする。そうすると、new フックによって以下のようなトレイラーが追加される。

Change-Id: I4805e5585f97d9cd882181e208c6ac3e315c0691

他にも変更が必要ならブランチに新しいコミットを追加する。このとき、それぞれのコミットへ異なる Change-Id が割り当てられる。

git rebase 等で複数のコミットをひとつに統合すると、元のコミットが持っていた Change-Id が複数コミットメッセージに含まれているが、コミットひとつに対して必ず Change-Id がひとつとなるよう割り当てなければならない。そのため、リベースの場合は統合前のコミットが持つ Change-Id を「どれかひとつ」だけ残して、他の Change-Id を削除する。

ドキュメントには、レビュアーがコメントを残した Change-Id を残すべきとある。

Terminal window
git history split <commit-ish>

こうすると git add -p のような選択するツールが起動して、選択した部分だけ最初のコミットに含まれ、選択しなかった変更は次の新しいコミットになる。しかしGit 2.54で git history split を実行した場合、commit-msg フックは呼ばれないようで、何も反応がなかった。同様に git history rewordcommit-msg が実行されないので、手動で git rebasegit commit を実行しなければならない。

Terminal window
git rebase -i <commit-ish>^
git commit --amend
git rebase --continue