0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Gerrit] Change-Idがなくてpushできない時の対処法

Posted at

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 インスタンス内で必ずしも一意であるとは限らないことに注意してください。異なるリポジトリまたはブランチ間で再利用できます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?