> 一文搞定 Git 仓库迁移,手把手教学,含常见问题和解决方案
在日常开发中,我们经常会遇到需要迁移 Git 仓库的场景:
- 公司换了 Git 服务器(从 GitLab 迁到 Gitee,或者自建服务器迁移)
- 代码仓库改名了
- 从 HTTP 协议切换到 SSH 协议
- 团队统一迁移到新的代码托管平台
今天我就来详细讲讲 Git 仓库迁移的几种方法,以及过程中可能遇到的坑和解决方案。
一、迁移前的准备工作
在开始之前,建议先做以下几件事:
1. 确认当前仓库状态
# 查看当前远程仓库地址
git remote -v
# 查看所有分支
git branch -a
# 查看最近的提交记录
git log --oneline -5
执行上述命令后,会看到类似下面的信息:
origin https://old-server.com/repo.git (fetch)
origin https://old-server.com/repo.git (push)
main
feature/login
develop
abc1234 (HEAD -> main) 修复登录bug
def5678 添加用户模块
ghi9012 初始化项目
2. 确保工作区是干净的
git status
执行后应该看到:
nothing to commit, working tree clean
如果有未提交的修改,先提交或 stash 起来。
3. 备份当前仓库(可选但推荐)
# 直接把整个文件夹复制一份
cp -r your-repo your-repo-backup
二、方法一:直接修改远程地址(最常用)
这是最常规的方法,适用于新旧仓库代码一致的场景。
步骤 1:修改远程仓库地址
git remote set-url origin https://new-server.com/username/repo.git
步骤 2:验证修改是否成功
git remote -v
执行后输出:
origin https://new-server.com/username/repo.git (fetch)
origin https://new-server.com/username/repo.git (push)
步骤 3:推送所有分支和标签
# 推送所有分支
git push -u origin --all
# 推送所有标签
git push -u origin --tags
步骤 4:拉取验证
git pull
三、方法二:添加新远程,保留旧远程
如果你不想删除旧远程地址(比如需要保留备份),可以添加一个新远程:
# 添加新远程(不覆盖旧的)
git remote add new-origin https://new-server.com/username/repo.git
# 推送到新远程
git push -u new-origin --all
git push -u new-origin --tags
# 后续如果想切换默认远程
git remote set-url origin https://new-server.com/username/repo.git
git remote remove new-origin
这种方式的好处是:你可以同时向两个仓库推送代码,平滑过渡。
四、方法三:完整迁移(使用 –mirror)
这是最彻底的迁移方式,会复制包括 hooks、配置、所有引用在内的全部内容。
# 1. 克隆旧仓库的镜像(裸仓库)
git clone --mirror https://old-server.com/username/repo.git
# 2. 进入仓库目录
cd repo.git
# 3. 修改远程地址为新仓库
git remote set-url origin https://new-server.com/username/repo.git
# 4. 镜像推送到新仓库
git push --mirror
# 5. 清理临时文件
cd ..
rm -rf repo.git
注意:--mirror 会覆盖新仓库的所有内容,请确保新仓库是空的或者你确实想覆盖。
五、方法四:保留提交历史的合并迁移
如果新仓库已经有了提交,你想把旧仓库的代码合并到新仓库中:
# 1. 添加旧仓库为远程
git remote add old-origin https://old-server.com/username/repo.git
# 2. 拉取旧仓库的所有分支
git fetch old-origin
# 3. 切换到目标分支(比如 main)
git checkout main
# 4. 合并旧仓库的分支(允许不相关的历史)
git merge old-origin/main --allow-unrelated-histories
# 5. 处理可能的冲突后,推送到新仓库
git push -u origin main
六、各方法对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 方法一 | 新旧仓库一致 | 简单快速 | 会覆盖旧远程配置 |
| 方法二 | 需要同时保留新旧远程 | 灵活,可双推 | 需要多一步操作 |
| 方法三 | 完整迁移,包括配置 | 最彻底 | 会覆盖新仓库所有内容 |
| 方法四 | 新仓库已有代码 | 可合并历史 | 可能产生冲突 |
七、常见问题与解决方案
问题 1:认证失败(用户名/密码错误)
现象:
fatal: Authentication failed
解决方案:
# 方式一:在 URL 中嵌入用户名和密码(注意密码中的特殊字符要 URL 编码)
git remote set-url origin https://username:password%40encoded@server.com/repo.git
# 方式二:使用凭据管理器
git config credential.helper manager
git push # 会弹窗让你输入密码
问题 2:SSL 证书错误
现象:
fatal: unable to access '...': SSL certificate problem
解决方案:
# 临时关闭 SSL 验证(仅用于测试)
git config http.sslVerify false
# 测试完后恢复
git config http.sslVerify true
问题 3:推送时提示 “remote: Repository not found”
原因:新仓库还没有创建,或者 URL 写错了。
解决方案:
- 先去代码托管平台创建好空仓库
- 确认 URL 是否正确(注意大小写和
.git后缀)
问题 4:推送时提示非快进合并(non-fast-forward)
现象:
! [rejected] main -> main (non-fast-forward)
解决方案:
# 先拉取再推送
git pull origin main --rebase
git push origin main
# 或者强制推送(慎用!会覆盖远程历史)
git push -f origin main
问题 5:密码中有特殊符号导致 URL 解析失败
常见特殊字符编码对照表:
| 字符 | URL 编码 |
|---|---|
@ | %40 |
/ | %2F |
, | %2C |
: | %3A |
# | %23 |
& | %26 |
? | %3F |
示例:密码 abc@123/ 编码后为 abc%40123%2F
八、迁移后的收尾工作
1. 验证迁移结果
# 查看远程地址
git remote -v
# 查看所有分支
git branch -a
# 查看最近的提交
git log --oneline -5
验证通过的标准:
- 远程地址正确
- 所有分支和标签都已推送
git pull和git push正常工作
2. 更新团队成员的本地仓库
通知所有协作者更新本地仓库的远程地址:
git remote set-url origin https://new-server.com/username/repo.git
3. 更新 CI/CD 配置
如果使用了 Jenkins、GitHub Actions 等 CI/CD 工具,记得更新它们的仓库地址和凭据。
九、总结
Git 仓库迁移其实并不复杂,核心就是修改 remote URL + 推送代码。根据不同的场景选择合适的方法:
- 日常换地址:直接用
git remote set-url - 完整迁移:用
git clone --mirror+git push --mirror - 合并迁移:用
fetch+merge --allow-unrelated-histories
最后提醒一下:迁移前一定要备份,迁移后务必验证,避免数据丢失。
如果过程中遇到问题,欢迎在评论区留言交流!
如果这篇文章对你有帮助,别忘了点赞、收藏、关注三连支持一下~