Git推送远程时被拒绝{更改###已关闭}

53

我在将本地主分支推送到远程主分支时遇到了问题,出现了以下错误:

remote: Processing changes: refs: 1, done
To ssh://xxxxx@gerrit.dev.xxxxx.net:29418/xxxxxx
 ! [remote rejected] HEAD -> refs/for/master (change 14823 closed)
error: failed to push some refs to 'ssh://xxxxx@gerrit.dev.xxxxx.net:29418/xxxxxx'

我该怎么解决这个问题?

git status显示我的分支比origin/master超前了5个提交。

19个回答

53

我收到了同样的消息。这是因为我已经成功地为两个提交获取了相同的Change-Id。可能是由于在我的本地分支之间进行了一些类似于Cherry-picking的操作。通过从提交消息中删除Change-Id,问题得到解决,然后提交挂钩添加了一个新的Id。


刚刚也犯了同样的错误。复制粘贴了错误的Change-Id,然后试图推送。 - Kaz
1
我的问题来自于在使用Gerrit的repo上必须修改的cherry-pick。移除Change-Id是解决方案。 - rickfoosusa
3
删除 change-id 将会创建新的 Gerrit 变更并生成新的审查。我有类似的情况,但不想失去我的审查评论和历史记录。 - Krishna Oza

43

你的提交更改ID已过期,即审核14823已关闭。你无法提交到同一个地方。

按照以下步骤解决问题:

  1. git commit --amend
  2. 删除更改ID
  3. 保存并退出
  4. 新的更改ID将添加到提交中。可以通过git log进行验证。
  5. 再次推送

请为我工作。谢谢。 - linjiejun
我有一个预提交钩子,用于运行测试覆盖率。有没有办法绕过它但是运行commit-msg钩子来生成变更ID?如果我运行--no-verify,它将绕过两个钩子,因此不会生成变更ID。 - Sushmit Sagar

7

2
你的提交注释中写了什么?如果提到了那个更改编号,可能会导致你的问题。 - Sterling Bourne
1
答案没有任何解决问题的方案。 - vetti
2
是的,它可以。只需更改您的提交注释以不包含任何更改ID,Gerrit将接受您的提交。天哪。 - Sterling Bourne
1
谢谢,那正是我的情况,不知道为什么被踩了,我给你点赞! - pmod
请注意,此答案中的链接已失效。这个可以用:https://git.eclipse.org/r/Documentation/error-change-closed.html - MindJuice
显示剩余2条评论

6

你有5个提交记录。

它们中的每一个都有一个名为“Commit Message”的文件(由Gerrit使用)。
其中一个文件有一个已被Gerrit接受并合并到主分支中的错误的“Change-Id”,因此不能再次使用。

一种解决方法是将所有5个提交合并成一个,
在这个过程中,删除“Commit Message”文件中的“Change-Id”。

在我的情况下,我有3个提交记录,所以我执行了:
git rebase -i HEAD~3

还有其他合并多个提交的方法:
Squash my last X commits together using Git


这对我很有效。看起来Gerrit依赖提交消息处理有点混乱。 - JohnyTex

5

如果您一直在进行变基并选择与审查相关的提交,但这些审查在此期间已被关闭(合并或放弃),那么您可以简单地再次变基,然后删除与审查相关的提交,而不是选择它们。然后,您应该可以再次推送而没有任何问题。 我强烈反对修改Change-Ids的建议。 具体的git命令如下:

git fetch; git rebase origin/a_branch --interactive

选择每个提交... 解决冲突,然后 git add ...

git rebase --continue
git push origin HEAD:refs/for/refs/heads/a_branch

-> 远程服务器拒绝接受...改变###已关闭

然后执行以下操作:

git fetch; git rebase origin/a_branch --interactive

选择(pick)每个提交,除了那些与要删除的更改###相关的提交应该被丢弃(drop)。您不应该有任何冲突,并立即成功地进行变基(之前的变基已经解决了冲突)。然后:

git push origin HEAD:refs/for/refs/heads/a_branch

1

change 14823 closed 的信息并不是来自于原始的 git。这意味着维护该代码库的人有一个更新或后置更新钩子,正在评估您的推送并由于本地策略而拒绝它(我猜测您正在向已标记为完成/关闭的问题添加其他提交)。您需要找出这些策略是什么,以及是否需要以某种方式重新打开更改,以便您可以向其添加提交,或者是否需要创建一个新的更改请求,并(可能)针对其进行重新基础化。


那可能是什么本地策略?我所做的只是获取最新代码,做一些微调,然后推送。每次它都失败并显示相同的消息。Git让我感到如此苦恼。 - Jono
正如@ebneter在另一个答案中指出的那样,引起烦恼的不是git,而是gerrit,它在git之上构建了一些策略,并作为钩子实现。您需要遵循gerrit的使用政策,更具体地说,是该特定存储库的管理员强制执行的任何其他政策。 - twalberg

1

我也遇到了这个问题,下面是解决方案:

  1. 执行 git pull --rebase 命令
  2. 尝试重新上传

如果出现合并冲突,请手动合并然后执行 git rebase --continue 命令。


1

在我的情况下,我有两个提交,第一个提交是我的,但第二个不是,所以我这样修复它:

  1. 找出在更改14823中提交的文件
  2. 找到你最早的提交,并对其父级进行软重置。请注意,如果你进行硬重置,可能会丢失所有提交。
  3. 尝试再次提交你的更改,但这次不包括更改14823中的文件

希望这有帮助。


1
git status 显示我的分支比 origin/master 超前了 5 次提交。
我所做的只是获取最新的代码,进行一些微调并将其推送。
这 5 次提交是什么?它们都是你的吗?
14823 变更是否对应于这 5 次提交之一?在 Gerrit 中它的状态是什么?

我之前的 push 失败了,因为我的日志中有一个 commit 不再在 gerrit 中。尝试获取 origin 并重置到远程 HEAD,然后再应用你的 commit 并重新 push。 - Noich

0
你正在向 Gerrit 推送代码,Gerrit 是一个代码审查工具,这可以从 URL(ssh://xxxxx@gerrit.dev.xxxxx.net:29418/xxxxxx)和 "HEAD -> refs/for/master" 信息中看出来。你需要咨询维护你正尝试推送的代码库的人,以找出为什么该更改被拒绝。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接