!镜像 git 存储库后出现[远程拒绝]错误

问题描述 投票:0回答:7

我正在关注此文档: https://help.github.com/articles/duplicating-a-repository/

git clone --mirror https://github.com/exampleuser/repository-to-mirror.git

cd repository-to-mirror.git

git push --mirror https://github.com/exampleuser/mirrored

输出显示存储库已作为镜像推送,但由于某种原因我也收到了这些错误:

 ! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/1/merge -> refs/pull/1/merge (deny updating a hidden ref)

这些错误是什么?我可以假设存储库已镜像吗?

git repository mirror
7个回答
63
投票

此问题中所述,当您镜像一个对其发出拉取请求的 GitHub 存储库时,就会发生这种情况。

以“

refs/pull
”开头的引用是由 GitHub 创建的合成只读引用 - 您无法更新(因此“清理”)它们,因为它们反映的分支很可能实际上来自其他存储库 - 那些分支已向您提交拉取请求。

因此,当您推送所有真实参考时,拉取请求不会更新

您需要镜像 GitHub 存储库而无需他们的拉取请求

只需将上面的包罗万象的引用规范替换为两个更具体的规范,即可包含所有头和标签,但不包含拉动,并且所有远程拉动引用将不再进入您的裸镜像:

fetch = +refs/heads/*:refs/heads/*
fetch = +refs/tags/*:refs/tags/*
fetch = +refs/change/*:refs/change/*

如果推送仍然失败,如Ofek Shilon评论,添加推送条目:

push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/change/*:refs/change/*

Git Refspec中所述:

+
告诉 Git 更新引用,即使它不是快进。


此更改将在裸存储库文件夹

repository-to-mirror.git
上完成,使用
git config --local --edit

要修改的命名遥控器是默认的“

origin
”。

目标是不获取不需要的引用,只推送我们需要的引用。


43
投票

完整步骤:

git clone --bare https://github.com/exampleuser/old-repository.git
cd old-repository
git push --mirror https://github.com/exampleuser/new-repository.git

17
投票

而不是

git clone --mirror

使用

git clone --bare

使用说明


5
投票

在那里找到了有效且简单的解决方案https://www.metaltoad.com/blog/git-push-all-branches-new-remote

git push newremote refs/remotes/oldremote/*:refs/heads/*

git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*

3
投票

(我希望这是一条评论,但声誉不够)

根据@VonC的回答,这听起来不是问题。

因此,当您推送所有真实参考时,拉取请求不会更新

我看到了两种您想要复制存储库的场景。

  1. 您想要一个您可以完全控制的存储库的备份/副本。
  2. 您正在修改存储库的历史记录,并且需要本地备份,以防需要撤消更改。

无论哪种情况,似乎

git clone --mirror
都是您最安全的选择,因为即使您在
push
中看到错误,所有与非拉取请求相关的内容都已成功推送,这可以解决场景 1。 对于场景 2 ,您希望这些拉取请求引用作为备份的一部分。


1
投票

在 fetch = +refs/:refs/ 行之后将这三行添加到 git 配置文件中,为我解决了这个问题:

push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/change/*:refs/change/*

1
投票

在尝试通过重写历史记录从 gitlab 中删除一些大文件时,我遇到了类似的发行人,按照此处的过程进行操作:https://docs.gitlab.com/ee/user/project/repository/reducing_the_repo_size_using_git.html

重要提示:在开始使用 gitlab 导出功能导出项目之前,这些步骤在我弄清楚之前多次出错。

我面临的问题是其他人提到的,你不能重写专门针对 PR 的只读引用(合并请求,因为它们在 gitlab 中被称为)

随后出现的明显想法是创建一个新的存储库,但这会释放所有问题、版本......

幸运的是,gitlab 允许将包含所有这些元数据的存储库导出到一个 zip 文件,其中包含所有捆绑的 git(更多信息这里有关 git 包的信息)。

捆绑包基本上是存储库的完整存档,您可以从中克隆:

git clone --mirror ./project.bundle

你没有项目的镜像(如果你有从服务器克隆的镜像也是如此),你可以使用

git filter-repo
或(BFG)[https://rtyley.github.io/bfg-repo -cleaner/] 如文档中所述,找到最大的文件并将其从历史记录中删除。

前后使用

du -h
确保您的存储库的大小确实更小,现在您可以使用以下命令创建新的 git 包

git bundle create --progress project.bundle --tags --branches master

尽管我建议在此过程之前处理所有分支,以避免弄乱分支。

您可以替换从gitlab下载的导出中的project.build(即创建一个结构完全相同的新tar.gz,注意前缀...) 这可以通过以下方式完成:

tar -xvzf project_name...export.tar.gz

替换project.bundle

cd project_name...export
tar -cvzf updated.tar.gz . # important to avoid messing up tar structure

以及重新导入项目。
您可以在 gitlab 中将项目重命名为 PROJECT_NAME-bkp,然后使用与之前相同的名称重新导入。

希望它可以节省其他人的时间。

© www.soinside.com 2019 - 2024. All rights reserved.