我正在关注此文档: 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 存储库时,就会发生这种情况。
以“
”开头的引用是由 GitHub 创建的合成只读引用 - 您无法更新(因此“清理”)它们,因为它们反映的分支很可能实际上来自其他存储库 - 那些分支已向您提交拉取请求。refs/pull
因此,当您推送所有真实参考时,拉取请求不会更新
只需将上面的包罗万象的引用规范替换为两个更具体的规范,即可包含所有头和标签,但不包含拉动,并且所有远程拉动引用将不再进入您的裸镜像:
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
”。
目标是不获取不需要的引用,只推送我们需要的引用。
完整步骤:
git clone --bare https://github.com/exampleuser/old-repository.git
cd old-repository
git push --mirror https://github.com/exampleuser/new-repository.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的回答,这听起来不是问题。
因此,当您推送所有真实参考时,拉取请求不会更新
我看到了两种您想要复制存储库的场景。
无论哪种情况,似乎
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 导出功能导出项目之前,这些步骤在我弄清楚之前多次出错。
我面临的问题是其他人提到的,你不能重写专门针对 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,然后使用与之前相同的名称重新导入。
希望它可以节省其他人的时间。