Git / Gerrit,推送被拒绝,未进行任何更改。

44

更改了一个提交,执行了提交修正(commit amend)操作。尝试进行push时出现以下错误:

! [remote rejected] master -> refs/for/master (no changes made)

在提交信息中检查更改ID,它仍然是有效的提交。

我尝试更改一个文件,检查它是否显示为修改,然后将其添加到暂存区并进行另一个提交修订。 再次尝试推送,但出现相同的问题。 对于这个问题没有任何想法。

编辑:这是推送到gerrit,而不是直接推送到git。

我正在运行:

git push origin master:refs/for/master

获取原产地详情的结果是(其中公司详情已编辑):

$ git remote show origin
* remote origin
  Fetch URL: ssh://lytee@gerrit.mycompany.net:29418/myrepo
  Push  URL: ssh://lytee@gerrit.mycompany.net:29418/myrepo
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master rebases onto remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

你正在运行哪个 push 命令,本地又在哪个分支上? - Amber
我正在本地的主分支上,运行 git push origin master:refs/for/master ,而 origin 已经设置了有效的获取和推送 URL。 - edwardmlyte
1
考虑到您使用的是 refs/for/... 语法而不是 refs/heads/... 语法,您是否在使用 Gerrit?如果是这样,那么这对您的问题非常重要,应该提及。 - Amber
啊,是的,我正在使用Gerrit。我会更新问题的。 - edwardmlyte
通常我在推送到gerrit时会使用git push origin HEAD:refs/for/master - Ilion
11个回答

52

这个问题是由我之前执行的操作引起的。我试图在一个仍在审查中的更改之上,推送一个新的更改,其父级也正在审查中。

 Trunk ------ Parent A ----- Parent B ----- New change
(merged)     (unmerged)     (unmerged)

我曾使用 cherry-pick 在本地获取这两个变更(Parent A 和 Parent B),然后第三次使用 cherry-pick 从本地分支获取我的变更,再尝试进行 push。这就导致了问题,因为我的个人变更实质上试图重写历史记录。

正确的流程是只有在主干时才 pull Parent B。这会自动将主干和它之间的任何提交一起拉取上来(在这种情况下只有 Parent A)。然后,在其上面 cherry-pick 我的新变更,push 就可以正常工作了。


10
今天我们遇到了一个问题。问题是我们在Gerrit中有: Change1(已合并)-- Change2(未合并)- Change3(未合并) 我们想要对Change3应用新的补丁集,但被拒绝了。信息提示:![remote rejected] master-> refs/for/master(没有进行任何更改)。经过一番思考,我们发现我们在本地进行了rebase操作,而Change2也收到了一个新的提交哈希值,但它没有任何新的更改。我们通过再次在本地进行交互式的rebase操作,并在提交消息的末尾添加一个字符来重新定义Change2,从而解决了这个问题。之后就可以顺利发布了。 - mortb

10
请参阅此问题的官方文档:https://gerrit-review.googlesource.com/Documentation/error-no-new-changes.html 我曾经遇到过相同的问题,原因是我推送了修改,然后放弃了合并,接着我进行了一些微调,并且错误地修订了我的提交并再次推送。这就是我收到错误提示的地方。
我的解决方法:
  1. 如果您只想快速解决此问题,请执行 git commit --amend,删除现有的 change-Id,假设您已经设置好 git hooks,您可以完成提交操作,然后会为您分配一个新的 change-Id
  2. 进入 Gerrit 并搜索您现有的 change-Id,找出问题所在,并进行相应的修复。(建议)

3

如果您正在尝试更新一组评论,每个评论都有自己的change-id需要保留(例如,在重新排序两个提交后进行变基),如果堆栈中的某些提交保持不变,则可能会被拒绝。您应该通过改写提交或类似的方法强制生成新的哈希值。


8
我不需要做任何更改,您要翻译的内容是:“我不得不执行一个“git commit --amend”,虽然没有进行任何更改,但这似乎解决了我的问题。” - Stuart
@Stuart,谢谢!这也帮助了我!为了快速解决问题,我在master上进行了交互式变基(git rebase -i master)。在那里,在每个pick (...)行后面,我添加了x git commit --amend --no-edit(如果您有昂贵的钩子,请添加--no-verify)。这个过程很顺利,推送审核的问题也消失了! - Adam Badura

2

我曾经遇到过同样的问题。只需更改提交信息并推送代码,就能成功。


1
我有多个提交记录,我想一次性将它们全部推送,该怎么做? - Sazzad Hissain Khan
完全不起作用 - ggDeGreat

1

听起来你已经正确地验证了你所做的更改,以便 Gerrit 可以接收。

git push origin master:refs/for/master

也许这就是问题所在?如果你的更改不在本地版本的主分支上,那么你没有推送你的更改。相反,请尝试:

git push origin HEAD:refs/for/master

HEAD 是 git 中表示当前提交的快捷方式。


同样的错误与该快捷方式有关。HEAD 是指当前分支中的当前更改,还是仅指主分支中的当前更改? - edwardmlyte
1
HEAD 指的是您当前的更改,时期。您所在的分支并不重要。如果使用 HEAD 推送没有帮助,我怀疑您的修订并没有更改提交。尝试在修订时更新/更改提交消息,然后再次推送。 - Brad
谢谢你的帮助 Brad,我发现我一直在错误地使用 Git。 - edwardmlyte

1

当我使用push命令时,出现了这个错误。

git commit -m  "updated message"

并且忘记了包括 --amend

git commit --amend -m  "updated message"

0

我遇到了同样的错误信息,但我试图推送的更改是在原始变更集的不同提交之上(使用git cherry-pick进行了一些魔术技巧,似乎gerrit不喜欢它)。我放弃了我的原始更改,当我意识到我可以解决这个问题时重新打开了它,但是使用git review发送给gerrit失败了。

此时,我的快速解决方案是从gerrit网站放弃原始更改,并通过使用git commit --amend从提交消息中删除change-Id: sha1最后一行来创建一个新的更改。


0

我曾经遇到过同样的问题。 同时,还有另一个提交没有合并到主分支,而是在Gerrit上进行了审核和变基。 也就是说,代码已经被推送进行审核,然后在Gerrit上进行了变基,并且等待审核完成。 一旦代码被审核通过,我就能够顺利地推送代码了。


0

当推送的提交与当前变更的补丁集完全相同时,Gerrit会使用此错误消息拒绝将其作为新的补丁集推送。

如果推送的提交满足以下条件,则被视为与当前补丁集完全相同:

  • 提交中的文件
  • 提交信息
  • 提交者
  • 提交的父级

全部相同。


0

正如其他人指出的那样,这是由于一个异常的审查请求。相同的更改ID已分配给您的提交。

当我修改提交并删除更改ID时,我的问题得到了解决。 git commit --amend 保存新更改后,它被分配给我的提交,我能够创建gerrit审查。

以下评论来自Google群组之一

“如果您修改更改并放置新的更改ID,则会起作用。我认为这很有意义,因为废弃的更改仍然存在于Gerrit中,因此除了需要新的更改ID之外,它没有其他选择,否则无法区分旧的废弃更改和新的主分支更改。”


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