You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含大量标签与分支的Git仓库从Bitbucket迁移到GitHub

问题根因

你遇到的GitHub内部服务器错误是服务端隐性阈值触发导致的:GitHub对单次git push携带的引用(包含分支、标签在内的所有refs)总数量、以及单次请求的处理时长有上限,你单次推送21000+标签+数百分支,超出了服务端处理阈值,触发了超时/负载拦截,和仓库内容本身无关。

优先HTTP协议的解决方案

方案1:分批推送引用(成功率最高)

不要一次性执行git push --mirror,拆分推送阶段,避开单次引用数量上限:

  1. 先清理冗余分支到你预期的500个以内,一次性推送全部分支:
git push origin --all
  1. 拆分标签为多批推送,每批控制在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
  1. 所有分支和标签推送完成后,再执行一次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:57:03