git push --mirror 提示“failed to push some refs”

11
我正在尝试创建一个脚本,可以将我的git存储库镜像到另一个存储库。一切都很顺利,但它一直提示:

[remote rejected] refs/pull/xx/head -> refs/pull/xx/head (The current action can only be performed by the system.)

这个仓库被克隆到了我的电脑上,然后被推送到另一个git。所有的文件和历史记录都被正确地克隆和推送了,但是一直出现这个“错误”。我该怎么办?

在此输入图片描述

这是我的脚本

git clone --mirror https://path1.com/_git/fredagsproject1
cd fredagsproject1.git
git remote set-url --push origin https://path2.com/_git/fredagsproject2
git push --mirror
2个回答

18

当你运行git push时,你的Git会通过互联网电话与另一个Git进行通信。你的Git向对方Git传递一些对象(提交等),然后向对方Git发送一堆请求:

  • 请设置refs/heads/branch指向提交1234567...
  • 请设置refs/tags/v1.2指向注释标签对象fedcba9...

诸如此类。

使用git push --mirror命令告诉你的Git要求对方的Git使用与请求中完全相同的名称来设置每个名称。正如图像所示(并且已复制到文本行中),其中许多名称具有以下形式:

refs/pull/xx/head

对于一些双位数的xx序列。

他们的Git只是在说:不行:我拒绝设置那个名称。

你可以尝试添加--force,这告诉你的Git发送一个命令——设置这些名称!而不是礼貌地请求请设置这些名称,但是看一下他们的Git拒绝时返回的原因

The current action can only be performed by the system.
似乎是这样说:“别碰这个名字!我保留它供自己使用,你怎么敢让我改变refs/pull/73/head!”,在这种情况下,命令形式(而不是礼貌请求形式)很可能也会被拒绝。
请注意,形如`refs/pull//head`和`refs/pull//merge`的引用名称在GitHub管理拉取请求等方面内部使用。您很可能甚至不应尝试设置这些名称——因此,如果您的尝试失败了,那可能是一件好事。

1
感谢您抽出时间解释发生了什么。我尝试使用--force,但没有成功。但正如您所说,这也不是一个好主意。我会将此答案标记为已接受。 :-) - Englund0110

0

这是对@torek回答的跟进。为了避免远程拒绝错误,请尝试以下命令,而不是使用git push --mirror

git push --all
git push --tags

--all选项将推送/refs/heads/下的所有引用,而--tags选项将推送/refs/tags下的所有引用。

大多数远程仓库都可以接受这些引用。虽然可以在上述命令中使用--force选项,但这是一种破坏性操作。在使用此选项时要非常小心。


很遗憾,这个方法行不通。Git拒绝推送,因为选项--mirror和--all/--tags不能同时使用。可能是因为它还记得克隆时使用了--mirror选项。 - undefined

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