Skip to content

Git 仓库迁移

原理概述

在 Git 版本控制系统中,迁移仓库意味着将一个仓库的所有提交历史、分支和标签完整地复制到另一个新的 Git 仓库地址。这样做可以出于多种原因,例如更换托管服务提供商、内部网络结构调整或是为了合并多个项目。本教程将指导你如何通过命令行实现这一目标,确保所有的远程分支都被保留在新仓库中。

步骤详解

准备本地环境

首先,在本地计算机上选择一个合适的位置创建或进入用于保存克隆仓库的文件夹:

bash
cd <目标文件夹路>

克隆远程仓库镜像

使用git clone --mirror命令来克隆旧仓库为一个 bare repository(裸库),它包含了完整的提交历史及所有分支与标签信息:

bash
git clone --mirror <旧的仓库地>

例如:

bash
git clone --mirror https://github.com/old-user/old-repo.git

切换至克隆出的 bare repository

完成克隆后,进入到刚刚生成的包含.git 后缀的文件夹,这是一个不包含工作目录的纯版本库结构:

bash
cd <刚刚clone生成的文件>

比如:

bash
cd old-repo.git

设置新的远程仓库地址

在 bare repository 中,更新远程仓库的 URL 指向新的地址。请确保在执行此步骤前已在新的 Git 服务上创建了空仓库:

bash
git remote set-url origin <新的仓库地>

例如:

bash
git remote set-url origin https://new-github.com/new-user/new-repo.git

推送所有内容至新仓库

最后一步是强制推送(-f 参数)当前仓库中的所有引用(包括但不限于分支和标签)到新的远程仓库。这会覆盖新仓库中现有的任何内容,确保源仓库的所有分支都被完全迁移过去:

bash
git push -f origin --all

为了同时迁移标签,还需要单独执行一次推送操作:

bash
git push -f origin --tags

注意事项

  • --mirror 参数在克隆时会创建一个包含所有远程分支、标签和其他引用的本地副本,并且默认配置为 push 时使用 mirror 方式,即同步所有内容。
  • 使用 -f--force 参数进行强制推送是因为迁移场景下通常需要覆盖新仓库的内容以保证与原仓库完全一致。但在非迁移场景下慎用该选项,因为它会重写远程仓库的历史数据。
  • 确保在迁移之前备份新仓库,以防意外情况导致数据丢失。