Gerritを使っていて、コミットメッセージの末尾(フッター)にChange-Idがなく
git push に失敗することがあったので、その対処法です。
動作確認環境は、Windows11、git 2.38.0、gerrit 3.6.2 です。
push時のエラー内容
$ git push origin HEAD:refs/for/master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (3/3), 281 bytes | 281.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Processing changes: refs: 1, done
remote: ERROR: commit 91240a8: missing Change-Id in message footer
remote:
remote: Hint: to automatically insert a Change-Id, install the hook:
remote: gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@localhost:hooks/commit-msg ${gitdir}/hooks/
remote: or, for http(s):
remote: f="$(git rev-parse --git-dir)/hooks/commit-msg"; curl -o "$f" http://localhost/tools/hooks/commit-msg ; chmod +x "$f"
remote: and then amend the commit:
remote: git commit --amend --no-edit
remote: Finally, push your changes again
remote:
To ssh://localhost:29418/test
! [remote rejected] HEAD -> refs/for/master (commit 91240a8: missing Change-Id in message footer)
error: failed to push some refs to 'ssh://localhost:29418/test'
手順1: .git/hooks ディレクトリに commit-msg ファイルを配置する
エラーのHintに記載の通り、Change-Idをコミット時に自動挿入するためのcommit-msgファイルを取得します。
ユーザ名やホストはご自身の環境に合わせて変えてください。(エラー文のコマンドをコピペでOKです。)
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@localhost:hooks/commit-msg ${gitdir}/hooks/
失敗する場合
以下エラーで失敗する場合は、scpコマンドに -O オプションをつけると成功します。
$ gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@localhost:hooks/commit-msg ${gitdir}/hooks/
subsystem request failed on channel 0
scp: Connection closed
$ gitdir=$(git rev-parse --git-dir); scp -O -p -P 29418 admin@localhost:hooks/commit-msg ${gitdir}/hooks/
commit-msg 100% 2272 765.5KB/s 00:00
gitのとあるバージョンあたりから -O オプションをつけないと失敗するようになった気がします。
-O が必要な理由は詳細見れてないですが、こちらのページを参考にしました。
手順2: git commit --amendでコミットを修正する
こちらもエラーのHintに記載の通り、以下コマンドを実行してコミットを修正します。
--amend オプションで直前のコミットの修正、--no-edit オプションでコミットメッセージの変更なしです。
git commit --amend --no-edit
以上です。git logを確認すると、コミットメッセージの末尾にChange-Idが付与されているので、再度pushを行ってください。
どうしてもcommit-msgが落とせない場合
手順1のcommit-msgがどうしても落とせない場合は、git commit --amend でコミットメッセージにChange-Idを
直接書いてあげる方法があります。既にgerritにアップされたコミットがあれば、
そのChange-Idをコピーして一部書き換えてあげるとよいです。
本来はSHA1で自動で作られるハッシュ値なので、手動で付与するのはあくまで暫定対応ですが。
これはコミットメッセージです。
これはコミットメッセージです。
Change-Id: Ic721d7c5cb44d18b70acb65ae8fb3dfae95f9264
ちなみにChange-Idはリポジトリ・ブランチ内で一意であればよいので、ほぼ被ることはないかと思います。
Note that a Change-Id is not necessarily unique within a Gerrit instance. It can be reused among different repositories or branches
Change-Id は、Gerrit インスタンス内で必ずしも一意であるとは限らないことに注意してください。異なるリポジトリまたはブランチ間で再利用できます