首页 > 解决方案 > 使用`git rebase --rebase-merges`时“拒绝用坏名更新引用”

问题描述

我最近不得不看git rebase --rebase-merges,但我运气不好。

我维护了一个 Rust 编译器的分支,我最近才在上游合并,一路上修复了大量的合并冲突。然后我不得不进行第二次合并,因为我运气不好,并且在我进行第一次合并时上游回购被破坏了。

我希望用来git rebase -i --rebase-merges将我的两个合并压缩在一起,但保留上游创建的嵌套合并(如果可能的话)。

问题是,无论我尝试什么,都会收到此错误消息:

$ git rebase --rebase-merges -i sd-upstream/master                                                                         
error: refusing to update ref with bad name 'refs/rewritten/Auto-merge-of-#65134---davidtwco:issue-19834-improper-ctypes-in-extern-C-fn,-r=rkruppe'
hint: Could not execute the todo command
hint: 
hint:     label Auto-merge-of-#65134---davidtwco:issue-19834-improper-ctypes-in-extern-C-fn,-r=rkruppe
hint: 
hint: It has been rescheduled; To edit the command before continuing, please
hint: edit the todo list first:
hint: 
hint:     git rebase --edit-todo
hint:     git rebase --continue

(上面sd-upstream是我的组织的上游,而不是 Rust 的——我在分支之前对树进行 rebase,并进行合并)

即使我没有对 todo 进行任何更改,我也会收到上述错误。

我做错了什么,还是一个 git bug?看起来 git 对 Bors 自动生成的提交消息感到窒息(Rust 团队使用机器人来进行汇总合并等)。

我在 Debian 10 上使用 git-2.20.1。

标签: gitgit-mergegit-rebase

解决方案


Git 2.25 中修复了一个错误--rebase-merges

  • 由“git rebase --rebase-merges”生成的待办事项列表中使用的标签用作引用名称的一部分;提出标签的逻辑已被收紧,以避免无法使用的名称。

除了该错误之外,还有一个相关的错误:

  • 避免“git rebase --rebase-merges”生成重复标签名称的逻辑忘记了机器本身使用“onto”作为标签名称,自动生成的标签必须避免这种情况,已更正。

(这两个都来自 Git 2.25发行说明。)

如果您将 Git 升级到 2.25 版,问题应该会消失。在那之前,我最好的建议是“不要使用--rebase-merges”。


推荐阅读