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



我遵循以下文档: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)

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

如本期所述,当您镜像一个向其发出拉取请求的GitHub回购时,就会发生这种情况。

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

所以,当你推送了所有真正的裁判时,拉取请求不会得到更新的

您需要镜像GitHub repo,而不需要他们的拉取请求。

只需将上面的catch-all refspec替换为两个更具体的规格,只包括所有的头和标签,而不包括拉力,所有的远程拉力将不再进入你的裸镜:

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参考规范中提到的:

+命令Git更新引用,即使引用不是快速转发。


此更改将使用git config --local --edit在裸存储库文件夹repository-to-mirror.git上完成。

要修改的命名远程是默认的"远程";CCD_ 5";一

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

完整步骤:

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

而不是

git克隆--镜像

使用

git克隆--裸

说明

在那里找到了有效且简单的解决方案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/*

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

根据@VonC的回答,这听起来没有问题。

所以,当你推送了所有真正的裁判时,拉取请求不会得到更新的

我看到了两种情况,其中您希望复制您的存储库。

  1. 您想要一个您完全可以控制的回购的备份/副本
  2. 您正在修改回购的历史记录,需要在本地进行备份,以防需要撤消更改

在任何一种情况下,git clone --mirror似乎都是最安全的选择,因为即使您在push中看到错误,所有与拉取请求无关的内容都已成功推送,这就解决了场景1的问题。对于场景2,您希望这些拉请求引用作为备份的一部分。

在fetch=+refs/:refs/行之后将这三行添加到git配置文件中为我修复了它:

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

当我试图通过重写历史记录从gitlab中删除一些大文件时,遇到了一个类似的颁发者,遵循这里的过程:https://docs.gitlab.com/ee/user/project/repository/reducing_the_repo_size_using_git.html

重要提示:在开始使用gitlab导出功能导出您的项目之前,这些步骤在我发现之前对我来说已经错误了很多次。

正如其他人所提到的,我面临的问题是,你不能重写只读refs,这是专门为PR(gitlab中称为合并请求)所做的

当时显而易见的想法是创建一个新的回购,但这将释放所有的问题,释放。。。

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

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

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

替换项目。绑定

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

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

希望它能节省别人的时间。

相关内容

最新更新