Gerrit error when Change-Id in commit messages are missing

GitMergeBranchMasterGerrit

Git Problem Overview


I set up a branch in the remote repository and made some commits on that branch. Now I want to merge the remote branch to the remote master.

Basically follows are my operations:

  1. checkout branch
  2. checkout master
  3. merge branch and fix merging errors
  4. commit
  5. push origin HEAD:refs/for/master

But get error messages on the 5th step:

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)

Git Solutions


Solution 1 - Git

Check if your commits have Change-Id: ... in their descriptions. Every commit should have them.

If no, use git rebase -i to reword the commit messages and add proper Change-Ids (usually this is a SHA1 of the first version of the reviewed commit).

For the future, you should install commit hook, which automatically adds the required Change-Id.

Execute scp -p -P 29418 username@your_gerrit_address:hooks/commit-msg .git/hooks/ in the repository directory or download them from http://your_gerrit_address/tools/hooks/commit-msg and copy to .git/hooks

Solution 2 - Git

Try this:

git commit --amend

Then copy and paste the Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a at the end of the file.

Save it and push it again!

Solution 3 - Git

If you need to add Change-Id to multiple commits, you can download the hook from your Gerrit server and run these commands to add the Change-Ids to all commits that need them at once. The example below fixes all commits on your current branch that have not yet been pushed to the upstream branch.

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

Solution 4 - Git

It is because Gerrit is configured to require Change-Id in the commit messages.

http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html

You have to change the messages of every commit that you are pushing to include the change id ( using git filter-branch ) and only then push.

Solution 5 - Git

You might be an admin doing a one-off push directly into refs/changes/<change_number>.

For example, once a commit without Change-Id landed into Subversion, you pull it out of Subversion using git-svn, and you'd like to archive it as a Gerrit patchset into a Gerrit change.

If so, you can go to project settings page (http://[installation-path]/#/admin/projects/[project-id]) and temporarily change "Require Change-Id in commit message" value to False.

Don't forget to afterwards change it back to Inherit or True!

Solution 6 - Git

Check your git repo before committing

gitrepo/.git/hooks/commit-msg

if this file is not present in that location then you will get this error "missing Change-Id in commit message" .

To solve this just copy paste the commit hook in .git folder.

Solution 7 - Git

You need to follow below 2 steps instructions:

[Issue] remote: Hint: To automatically insert Change-Id, install the hook:

  1. gitdir=$(git rev-parse --git-dir);

  2. scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/

normally $gitdir = ".git". You need to update the username and the Gerrit link.

Solution 8 - Git

1) gitdir=$(git rev-parse --git-dir);

2) scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg ${gitdir}/hooks/

a) I don't know how to execute step 1 in windows so skipped it and used hardcoded path in step 2 scp -p -P 29418 <username>@gerrit.xyz.se:hooks/commit-msg .git/hooks/

b) In case you get below error, manually create "hooks" directory in .git folder

protocol error: expected control record

c) if you have submodule let's say "XX" then you need to repeat step 2 there as well and this time replace ${gitdir} with that submodules path

d) In case scp is not recognized by windows give full path of scp

"C:\Program Files\Git\usr\bin\scp.exe"

e) .git folder is present in your project repo and it's hidden folder

Solution 9 - Git

under my .git/hooks folder, some sample files were missing. like commit-msg,post-commit.sample,post-update.sample...adding these files resolved my change id missing issue.

Solution 10 - Git

By default, Gerrit will prevent pushing for review if no Change-Id is provided. Change-Id gets added to the footer of the commit message on the client side. You must download and setup the commit-msg script at the beginning. You can find more in Gerrits documentation.

git clone ssh://gerrithost:29418/RecipeBook.git RecipeBook
scp -p -P 29418 gerrithost:hooks/commit-msg RecipeBook/.git/hooks/
chmod u+x .git/hooks/commit-msg

Solution 11 - Git

I got this error message too.

and what makes me think it is useful to give an answer here is that the answer from @Rafał Rawicki is a good solution in some cases but not for all circumstances. example that i met:

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"

solution:

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

Solution 12 - Git

We solved this issue this morning by re-cloning repository and re-applying changes. This is the simplest way to re-sync your local copy with Gerrit. As always we created a backup first.

Although there are a number of other wildly complicated solutions, its often advantageous to take a simple approach to avoid making things worse.

Solution 13 - Git

This can also happen if you have this restriction:

> Please enter the commit message for your changes. Lines starting with '#' will be ignored, and an empty message aborts the commit.

and you do like me: write a commit message starting with "#" .....

I had the same error, but I already had the commit-msg and did the rebase and everything. Very silly mistake though :D

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPan RuochenView Question on Stackoverflow
Solution 1 - GitRafał RawickiView Answer on Stackoverflow
Solution 2 - Gitvailaya shreeshaView Answer on Stackoverflow
Solution 3 - GitMatt CowellView Answer on Stackoverflow
Solution 4 - GitmanojldsView Answer on Stackoverflow
Solution 5 - GitIvan VučicaView Answer on Stackoverflow
Solution 6 - GitmahinlmaView Answer on Stackoverflow
Solution 7 - GitKashanView Answer on Stackoverflow
Solution 8 - GitRavi YadavView Answer on Stackoverflow
Solution 9 - Gitschin chanView Answer on Stackoverflow
Solution 10 - GitffloresView Answer on Stackoverflow
Solution 11 - GitkagbView Answer on Stackoverflow
Solution 12 - GitBrad HeinView Answer on Stackoverflow
Solution 13 - Gitladybug23View Answer on Stackoverflow