如何将含大量标签与分支的Git仓库从Bitbucket迁移到GitHub
问题根因
你遇到的GitHub内部服务器错误是服务端隐性阈值触发导致的:GitHub对单次git push携带的引用(包含分支、标签在内的所有refs)总数量、以及单次请求的处理时长有上限,你单次推送21000+标签+数百分支,超出了服务端处理阈值,触发了超时/负载拦截,和仓库内容本身无关。
优先HTTP协议的解决方案
方案1:分批推送引用(成功率最高)
不要一次性执行git push --mirror,拆分推送阶段,避开单次引用数量上限:
- 先清理冗余分支到你预期的500个以内,一次性推送全部分支:
git push origin --all
- 拆分标签为多批推送,每批控制在500~1000个,避免单次携带过多标签,示例批量脚本:
# 每1000个标签分一批推送 git tag | split -l 1000 - tag_batch_ for batch in tag_batch_* do git push origin $(cat $batch) rm -f $batch done
- 所有分支和标签推送完成后,再执行一次mirror推送同步剩余小众引用(比如notes、自定义refs等):
git push origin --mirror
此时服务端仅需要处理少量增量引用,不会触发阈值。
方案2:调整HTTP配置降低服务端压力
在你已设置的http.postBuffer基础上,新增两个配置优化请求逻辑:
# 增大HTTP请求缓冲区到1G git config --global http.maxRequestBuffer 1048576000 # 关闭位图推送优化,降低服务端解压计算压力 git config --global push.useBitmaps false
调整后再尝试git push --mirror,大概率可以通过。
SSH传输提速方案
如果需要使用SSH协议,可通过开启SSH压缩解决传输慢的问题,调整后速度基本和HTTP持平:
在本地~/.ssh/config文件中新增如下配置:
Host github.com User git Compression yes CompressionLevel 6 TCPKeepAlive yes ServerAliveInterval 60 ServerAliveCountMax 10
兜底循环推送脚本
如果上述方案均失效,可使用如下脚本自动批量推送所有分支和标签,无需手动操作:
# 批量推送所有本地分支 for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/) do git push origin "$branch" done # 批量推送所有标签 for tag in $(git tag) do git push origin "$tag" done
内容的提问来源于stack exchange,提问作者fengelhardt
相关产品推荐
相关产品推荐

