リモートリポジトリにブランチを設定し、そのブランチでいくつかのコミットを行いました。ここで、リモートブランチをリモートマスターにマージします。
基本的に私の操作は次のとおりです。
ただし、5番目のステップでエラーメッセージを取得します。
remote: Resolving deltas: 0% (0/12)
remote: ERROR: missing Change-Id in commit message
...
remote: Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a
To ssh://[email protected]:29418/hello_git
! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message)
コミットの説明にChange-Id: ...
が含まれているかどうかを確認してください。すべてのコミットにはそれらが必要です。
いいえの場合、git rebase -i
を使用してコミットメッセージを書き換え、適切な変更IDを追加します(通常、これはレビュー済みコミットの最初のバージョンのSHA1です)。
将来的には、必要なChange-Idを自動的に追加するコミットフックをインストールする必要があります。
リポジトリディレクトリでscp -p -P 29418 username@your_gerrit_address:hooks/commit-msg .git/hooks/
を実行するか、http://your_gerrit_address/tools/hooks/commit-msg
からダウンロードして.git/hooksにコピーします
これを試して:
git commit --amend
次に、Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a
をファイルの最後にコピーして貼り付けます。
保存してもう一度プッシュしてください!
Change-Idを複数のコミットに追加する必要がある場合は、Gerritサーバーからフックをダウンロードし、これらのコマンドを実行して、Change-Idを一度に必要とするすべてのコミットに追加できます。以下の例は、現在のブランチで、まだアップストリームブランチにプッシュされていないすべてのコミットを修正します。
tmp=$(mktemp)
hook=$(readlink -f $(git rev-parse --git-dir))/hooks/commit-msg
git filter-branch -f --msg-filter "cat > $tmp; \"$hook\" $tmp; cat $tmp" @{u}..HEAD
これは、コミットメッセージでChange-Idを要求するようにGerritが構成されているためです。
http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html
プッシュするすべてのコミットのメッセージを変更して、変更ID(git filter-branch
を使用)を含めてからプッシュするようにする必要があります。
管理者がrefs/changes/<change_number>
に1回限りのプッシュを直接行う場合があります。
たとえば、Change-IdのないコミットがSubversionに到達したら、git-svnを使用してSubversionからプルアウトし、GerritパッチセットとしてGerritの変更にアーカイブします。
その場合は、プロジェクト設定ページ( http:// [installation-path] /#/ admin/projects/[project-id] )に移動し、「コミット時に変更IDが必要」を一時的に変更できます。メッセージ」の値をFalseにします。
その後、継承またはTrueに戻すことを忘れないでください!
1) gitdir=$(git rev-parse --git-dir);
2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/
a)Windowsでステップ1を実行する方法がわからないため、スキップしてstep 2 scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg .git/hooks/
でハードコードされたパスを使用しました
b)エラーが発生する場合は、.gitフォルダーに「hooks」ディレクトリを手動で作成します
protocol error: expected control record
c)サブモジュールがある場合、「XX」と言うと、ステップ2も繰り返す必要があり、今回は$ {gitdir}をそのサブモジュールパスに置き換えます
d)Windowsでscpが認識されない場合は、scpのフルパスを指定します
"C:\Program Files\Git\usr\bin\scp.exe"
e).gitフォルダーがプロジェクトリポジトリにあり、隠しフォルダーです
コミットする前にgitリポジトリを確認してください
gitrepo/.git/hooks/commit-msg
このファイルがその場所に存在しない場合、「コミットメッセージにChange-Idが見つかりません」というエラーが表示されます。
この問題を解決するには、コミットフックをコピーして.gitフォルダーに貼り付けます。
以下の2つのステップの指示に従う必要があります。
[Issue] remote:ヒント:Change-Idを自動的に挿入するには、フックをインストールします。
1)gitdir=$(git rev-parse --git-dir);
2)scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/
通常$ gitdir = ".git"。ユーザー名とGerritリンクを更新する必要があります。
私もこのエラーメッセージを受け取りました。
ここで答えを出すことが有益だと思うのは、@RafałRawickiからの答えがすべての状況ではなく、場合によっては良い解決策であるということです。私が会った例:
1.run "git log" we can get the HEAD commit change-id
2.we also can get a 'HEAD' commit change-id on Gerrit website.
3.they are different ,which makes us can not Push successfully and get the "missing change-id error"
解決:
0.'git add .'
1.save your HEAD commit change-id got from 'git log',it will be used later.
2.copy the HEAD commit change-id from Gerrit website.
3.'git reset HEAD'
4.'git commit --amend' and copy the change-id from **Gerrit website** to the commit message in the last paragraph(replace previous change-id)
5.'git Push *' you can Push successfully now but can not find the HEAD commit from **git log** on Gerrit website too
6.'git reset HEAD'
7.'git commit --amend' and copy the change-id from **git log**(we saved in step 1) to the commit message in the last paragraph(replace previous change-id)
8.'git Push *' you can find the HEAD commit from **git log** on Gerrit website,they have the same change-id
9.done
今朝、リポジトリのクローンを再作成し、変更を再適用することでこの問題を解決しました。これは、ローカルコピーをGerritと再同期する最も簡単な方法です。いつものように、最初にバックアップを作成しました。
他にも非常に複雑な解決策は数多くありますが、事態を悪化させないために簡単なアプローチをとることがしばしば有利です。
.git/hooksフォルダーの下に、いくつかのサンプルファイルがありませんでした。 commit-msg、post-commit.sample、post-update.sampleのように...これらのファイルを追加すると、変更IDの欠落問題が解決しました。