GitでChange-Idを自動付与する方法
This content is a draft and will not be included in production builds.
GerritのChange-Idとは何かで何者なのかをまとめたが、ここでは Change-Id をどうやって付与するのかを書く。
インストールの流れ
Section titled “インストールの流れ”公式フックスクリプトをダウンロード
Section titled “公式フックスクリプトをダウンロード”Gerrit公式でGitのフックスクリプトを配布しているが、これはGerritをインストールしたサーバから落とす必要がある。一般的にGerritサーバを持っていないと思うので、公開されているGerritサーバを参照するといい。例えばGoやAndroidが使えるかもしれない。以下ではGoの例を示す。
curl -O https://go-review.googlesource.com/tools/hooks/commit-msgGitにフックを設定
Section titled “Gitにフックを設定”上記でダウンロードした commit-msg をそのまま .git/hooks に置いても良いのだが、Git 2.54からは用途別にフックを置けるようになっているので、それを使うと良いだろう。
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- プリフィックスを付けているけれど、命名規則は無いのでなんでもいい。
実際のワークフロー
Section titled “実際のワークフロー”Gerrit Code Review - Change-Idsを参考に、実際の開発で行うことを調べる。
コミットを作成
Section titled “コミットを作成”作業をはじめるとき、これまで通り新しいブランチを作成して、そこで開発を行う。変更が終わったら git commit でコミットする。そうすると、new フックによって以下のようなトレイラーが追加される。
Change-Id: I4805e5585f97d9cd882181e208c6ac3e315c0691他にも変更が必要ならブランチに新しいコミットを追加する。このとき、それぞれのコミットへ異なる Change-Id が割り当てられる。
複数のコミットを統合
Section titled “複数のコミットを統合”git rebase 等で複数のコミットをひとつに統合すると、元のコミットが持っていた Change-Id が複数コミットメッセージに含まれているが、コミットひとつに対して必ず Change-Id がひとつとなるよう割り当てなければならない。そのため、リベースの場合は統合前のコミットが持つ Change-Id を「どれかひとつ」だけ残して、他の Change-Id を削除する。
ドキュメントには、レビュアーがコメントを残した Change-Id を残すべきとある。
ひとつのコミットを分割
Section titled “ひとつのコミットを分割”git history split <commit-ish>こうすると git add -p のような選択するツールが起動して、選択した部分だけ最初のコミットに含まれ、選択しなかった変更は次の新しいコミットになる。しかしGit 2.54で git history split を実行した場合、commit-msg フックは呼ばれないようで、何も反応がなかった。同様に git history reword も commit-msg が実行されないので、手動で git rebase や git commit を実行しなければならない。
git rebase -i <commit-ish>^git commit --amendgit rebase --continue