当前位置: 首页 > news >正文

怎么迁移 Git 仓库到新版本服务器保留所有分支历史

迁移 Git 仓库到新服务器并保留所有分支历史,最可靠的方式是使用git clone `--bare`配合git push `--mirror`。这种方式适合需要完整保留分支、标签和提交记录的场景,但操作前必须确保源仓库停止写入,防止数据不一致。

先说结论:用裸克隆加镜像推送能完整复制仓库的所有引用,但目标仓库必须为空且需提前处理分支保护策略。

  • 适合:跨平台迁移、服务器更换、需要保留全部提交历史的场景
  • 先看:目标仓库是否为空、是否有保护分支、源仓库是否有 LFS 文件
  • 建议:迁移前锁定源仓库防止新提交、迁移后验证分支和标签数量、保留源仓库至少一周作为备份

核心命令

以下是可直接执行的迁移命令,替换其中的仓库地址即可。注意命令中不要包含多余符号:

git clone `--bare` https://old-server.com/group/project.git
cd project.git
git push `--mirror` https://new-server.com/group/project.git
cd ..
rm -rf project.git

如果源仓库使用了 Git LFS,迁移后需在新仓库执行git lfs fetch `--all`补全大文件对象。

迁移前准备

第一步:锁定源仓库

迁移过程中如果有新的提交推送到源仓库,会导致数据不一致。建议在维护窗口期操作,或在 GitLab/GitHub 设置中将源仓库设为“Read Only”,并通知团队暂停推送。

第二步:检查源仓库状态

记录源仓库的分支和标签数量,作为迁移后的验证依据:

git ls-remote `--heads` https://old-server.com/group/project.git | wc -l
git ls-remote `--tags` https://old-server.com/group/project.git | wc -l

第三步:创建空的目标仓库

在新服务器上创建空白项目,不要初始化 README、.gitignore 或 license 文件。如果平台自动生成了初始文件,必须手动删除或重建项目,否则镜像推送会因 non-fast-forward 被拒绝。

详细操作步骤

第四步:执行裸克隆

git clone `--bare` https://old-server.com/group/project.git
cd project.git

克隆完成后会生成以.git 结尾的目录,这是裸仓库,没有工作目录,不支持 git status 或 git checkout,只用来推送。

第五步:处理分支保护

如果目标仓库的 master 或 main 分支被设为受保护,推送会失败。需要临时关闭保护或让管理员用维护者权限执行推送。在 GitLab 中进入 Settings → Branches,勾选 Allow force pushes 或 Developers can push。

第六步:镜像推送

git push `--mirror` https://new-server.com/group/project.git

注意这里是两个短横线`--mirror`。推送完成后可以删除本地裸仓库。警告:`--mirror`会强制覆盖远程所有引用,如果本地裸仓库克隆不完整,会导致远程分支丢失,务必确认第一步克隆成功。

第七步:配置 LFS(如适用)

如果源仓库用了 Git LFS,`--mirror`不会自动迁移 LFS 对象,需在新仓库克隆后执行:

git clone https://new-server.com/group/project.git
cd project
git lfs fetch `--all`
git lfs checkout

验证与回滚

验证方法

迁移完成后,对比源仓库和目标仓库的引用数量:

git ls-remote `--heads` https://old-server.com/group/project.git | wc -l
git ls-remote `--heads` https://new-server.com/group/project.git | wc -l

两行输出应该一致。同样验证标签:

git ls-remote `--tags` https://old-server.com/group/project.git | wc -l
git ls-remote `--tags` https://new-server.com/group/project.git | wc -l

还可以克隆新仓库到本地,检查git branch -agit tag的输出是否与源仓库一致。

回滚方案

如果迁移后发现数据缺失或配置错误:

  1. 立即停止团队对新仓库的写入。
  2. 由于`--mirror`已覆盖目标仓库,无法直接撤销。
  3. 若源仓库仍保留,重新执行迁移流程。
  4. 若源仓库已销毁,需从服务器备份恢复目标仓库数据。
  5. 建议验证无误前,源仓库至少保留一周只读状态。

常见报错与解决

目标仓库非空

报错:error: failed to push some refs to ...rejected

解决:如果新仓库已有初始提交,镜像推送会失败。必须先清空或重建项目,确保目标仓库完全空白。

保护分支拦截

报错:[remote rejected] master -> master (pre-receive hook declined)

解决:这不是命令错误,是目标仓库的分支保护策略在拦截。需要临时关闭保护或用更高权限账号推送。

忘记进裸仓库目录

报错:fatal: 'origin' does not appear to be a git repository

解决:克隆后直接在父目录下执行git push `--mirror`会报错,必须先cd project.git

LFS 文件丢失

现象:大文件变成指针文件,无法读取内容。

解决:`--mirror`不会自动迁移 LFS 对象,需要在目标端手动补全,否则大文件会变成指针文件。

分支名不匹配

现象:原仓库主分支叫 main,但推送后只有 master。

解决:推送前确认分支名一致,`--mirror`会保留原分支名,不要手动指定git push origin master

原文链接:https://www.zjcp.cc/ask/11192.html

http://www.jsqmd.com/news/824261/

相关文章:

  • 5分钟快速上手Sabaki:打造专业围棋对弈环境的终极指南
  • 抖音去水印视频解析用什么工具?2026 免费安全工具推荐,抖音视频怎么去掉水印一文搞定 - 爱上科技热点
  • OrangePi 4A深度评测:八核ARM开发板如何以NVMe与多核性能挑战树莓派
  • AP的全称是什么?
  • 企业级AI知识库系统的开发流程
  • 如何在10分钟内用AI生成专业短视频:MoneyPrinterTurbo完整指南
  • 免费抖音去水印工具推荐:在线、小程序、软件哪个好用?2026 实测全盘点 - 爱上科技热点
  • CircuitPython海龟绘图:嵌入式图形编程入门与实践
  • 告别命令行:用VSCode Remote-SSH + GDB可视化调试Linux服务器C++程序(保姆级配置)
  • 2026年5月可靠的高清图片素材/素材平台推荐高品图像 - 品牌鉴赏师
  • 深度解析:基于内核模式的硬件信息修改实战指南
  • Codex 免费额度总不够?两个工具帮你搞定多账号管理与自动切换
  • 绝对不要让两根线在同一个交换机上连成一个圈。 为什么 形成一个环就会网络风暴?
  • UE5 CommonUI实战:手把手教你打造带导航堆栈的游戏菜单系统(含输入绑定)
  • 如何用免费在线工具轻松解读无人机飞行数据
  • 抖音视频怎么在线解析去水印?2026实测无水印提取方法盘点 - 爱上科技热点
  • 关于腾讯广告算法大赛2025项目分析3-重读
  • 3DSC特征详解:从‘球形直方图’到点云‘指纹’,理解局部描述子如何抵抗噪声
  • 终极Vue绘图指南:vue-drawing-canvas快速实现网页画板功能
  • Vibe Coding实践指南:打造高效愉悦的开发环境与工作流
  • 小红书视频怎么提取无水印?小红书视频解析在线提取工具 2026 实测推荐 - 爱上科技热点
  • 第9课:Linux开发工具(四):make与makefile
  • 抖音去水印视频解析用什么工具?免费又安全的解析工具推荐,2026 亲测有效 - 爱上科技热点
  • 互联网大厂Java求职面试:从Spring Boot到微服务的探索
  • Agent从“能用“到“管好“,中间差了什么?
  • 2026年手机免费一键去水印App排行榜 | 手机免费一键去水印App推荐测评 - 爱上科技热点
  • 信道估计模块
  • 【机器人】基于QLearning强化学习的AGV智能搬运机器人快递搬运系统matlab仿真
  • 视频去水印无损工具推荐:去水印后和原视频一样,2026实测最有效的方法 - 爱上科技热点
  • 手机端视频转音频教程 几步搞定不用安装软件 - 爱上科技热点