57

我在远程存储库中建立了一个分支,并在该分支上进行了一些提交。现在我想将远程分支合并到远程主控。

基本上以下是我的操作:

  1. 结帐分行
  2. 结帐大师
  3. 合并分支并修复合并错误
  4. 犯罪
  5. 推原点 HEAD:refs/for/master

但在第 5 步收到错误消息:

remote: Resolving deltas:   0% (0/12)

remote: ERROR: missing Change-Id in commit message
...

remote: Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a

To ssh://prc@test.gerrit.xxx.com:29418/hello_git
 ! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message)
4

13 回答 13

91

检查您的提交是否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 下载并复制到

于 2012-01-13T11:13:03.103 回答
28

尝试这个:

git commit --amend

然后复制并粘贴Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a到文件末尾。

保存并再次推送!

于 2013-06-11T04:01:46.200 回答
7

如果您需要将 Change-Id 添加到多个提交,您可以从 Gerrit 服务器下载钩子并运行这些命令以将 Change-Ids 添加到一次需要它们的所有提交中。下面的示例修复了当前分支上尚未推送到上游分支的所有提交。

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
于 2014-09-12T20:52:41.453 回答
5

这是因为 Gerrit 被配置为在提交消息中需要 Change-Id。

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

您必须更改要推送的每个提交的消息以包含更改 id ( using git filter-branch),然后才能推送。

于 2012-01-13T04:30:51.250 回答
2

您可能是一名管理员,直接将一次性推送到refs/changes/<change_number>.

例如,一旦没有 Change-Id 的提交进入 Subversion,您使用 git-svn 将其从 Subversion 中拉出,并且您希望将其作为 Gerrit 补丁集归档到 Gerrit 更改中。

如果是这样,您可以转到项目设置页面 ( http://[installation-path]/#/admin/projects/[project-id] ) 并将“提交消息中的要求更改 ID”值临时更改为 False。

不要忘记之后将其更改回 Inherit 或 True!

于 2015-07-13T01:16:17.100 回答
2

在提交之前检查你的 git repo

gitrepo/.git/hooks/commit-msg

如果该文件不存在于该位置,那么您将收到此错误 "missing Change-Id in commit message" 。

要解决这个问题,只需将提交挂钩复制粘贴到 .git 文件夹中。

于 2015-07-22T11:49:52.140 回答
2

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.

于 2018-04-30T13:26:09.567 回答
2

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 文件夹存在于您的项目存储库中,它是隐藏文件夹

于 2018-08-09T04:29:21.843 回答
0

在我的 .git/hooks 文件夹下,一些示例文件丢失了。像 commit-msg、post-commit.sample、post-update.sample...添加这些文件解决了我的更改 ID 丢失问题。

于 2018-10-29T10:38:54.800 回答
0

默认情况下,如果没有提供 Change-Id,Gerrit 将阻止推送审查。Change-Id 被添加到客户端提交消息的页脚。您必须在开始时下载并设置 commit-msg 脚本。您可以在 Gerrits 文档中找到更多信息。

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
于 2022-01-10T11:17:58.133 回答
-1

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.

于 2014-09-09T14:14:16.717 回答
-1

我也收到此错误消息。

让我觉得在这里给出答案很有用的是,@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
于 2013-12-04T08:15:18.267 回答
-1

如果您有以下限制,也会发生这种情况:

请输入您的更改的提交消息。以 '#' 开头的行将被忽略,并且一条空消息中止提交。

你确实喜欢我:写一个以“#”开头的提交信息.....

我有同样的错误,但我已经有了commit-msg并且做了所有的rebase事情。虽然非常愚蠢的错误:D

于 2016-02-27T02:53:12.370 回答