Gerrit 不允许推送代码

Gerrit is not allowing to push the code

我有一个 git 存储库,我在其中创建了一个项目。已经有一些现有的项目运行良好。

现在我想推送这个新项目的代码,我已经在提交中添加了 gerrit change-id 但在尝试推送时仍然出现以下错误。 我正在使用 egit( eclipse git) 作为 git 客户端

 missing Change-Id in commit message footer
Processing changes: refs: 1
Processing changes: refs: 1, done    
ERROR: missing Change-Id in commit message footer

Hint: To automatically insert Change-Id, install the hook:
  gitdir=$(git rev-parse --git-dir); scp -p -P 29418 i054564@git.wdf.sap.corp:hooks/commit-msg ${gitdir}/hooks/
And then amend the commit:
  git commit --amend

当我将新项目添加到 gerrit 的现有 git 存储库时,是否需要进行任何配置?

您似乎试图将多个提交推送到 Gerrit,但只有最后一个具有 Change-Id。当您将提交推送到 Gerrit 时,Gerrit 中尚不存在的所有父提交也将被推送。查看 Git 日志以检查所有将被推送的提交。

我将对马塞洛的回答做一些补充说明。

假设提交历史是A-B-C-D。 C 和 D 是您新提交的内容。如果 C 或 D 没有 change-id,则推送被阻止。在这种情况下,您需要在再次推送之前重写 C 和 D(假设两者都没有 change-id)的提交消息。

首先按照错误日志的说明安装钩子。

gitdir=$(git rev-parse --git-dir); scp -p -P 29418 i054564@git.wdf.sap.corp:hooks/commit-msg ${gitdir}/hooks/

运行 git log 检查提交。

重写提交消息。

git reset B --hard
git cherry-pick C
git commit --amend
#simply save and quit
git cherry-pick D
git commit --amend
#simply save and quit.

如果存在 change-id,您可以删除整个 change-id 行,保存并退出,以便 commit-msg 生成一个新的 change-id。在某些情况下,您可能需要它。

为了自动为每个克隆部署挂钩 commit-msg,您可以将此 commit-msg 添加到 Git 的 TEMPLATE DIRECTORY 中。完成此复制后,您可以在现有存储库中 运行 git init 作为将 commit-msg 复制到其中的替代方法。

既然你用的是Gerrit,那我就多说几句。 merge-commit 不会触发挂钩 commit-msg,因此即使已部署挂钩,本地真正的合并也不会有 change-id。这也会阻止推送。所以在推送之前不要使用 git pull origin <branch> 来同步和更新本地分支。 git pull origin --rebase <branch>git fetch origin <branch> && git rebase FETCH_HEAD 哪个更好。这使得在本地没有合并提交。