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

将svn项目迁移到git

一、为什么从 SVN 迁移到 Git?

在过去很长一段时间,很多公司都使用 SVN 作为版本控制工具。随着 Git 的普及,以及 CI/CD 等现代开发工具链的兴起,越来越多团队考虑从 SVN 迁移到 Git。

本篇博客记录我实际操作的一次 SVN 到 Git 的迁移过程:我想将一个SVN老项目带走,因为SVN离开公司的中心服务器原来的提交历史等信息就会丢失,我自然就想到Git的自身就能进行版本控制的能力,然后我会出差来到一个无网络环境(局域网),此时我将进行一些开发做一些提交,最后回到公司将这些提交集成会公司的中心服务器.

Git的优势:

  • Git 分支管理灵活,支持分布式开发

  • 支持离线提交、离线历史查看

  • 集成更丰富的代码托管平台(GitHub、GitLab、Gitea 等)

  • 配合 CI/CD、Pull Request 等现代开发流程更友好


二、环境准备

工具:

如果你不熟悉Git可以看我的这篇博客:在Unity环境中使用Git进行版本控制(入门篇)_unity git-CSDN博客

安装了Git后在一个文件夹下验证一下环境:

在任意一个目录下右键发现一个Open Git Bash 验证下面两个命令

git --version
git svn --version

 

 


三、获取 SVN 作者信息映射表(可选)

如果不关心作者信息,则建议直接省略,省略这步则会直接使用SVN中的作者信息

如果想让 SVN 的历史作者正确映射成 Git 格式,需要一份作者映射表。

生成作者映射文件:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2"@example.com>"}' | sort -u > userinfo.txt

然后根据需要编辑 userinfo.txt,把 SVN 用户名改成人名邮箱等 Git 风格。


四、执行 git-svn 克隆

进入一个空目录(该目录是用来存放项目的):

git svn clone https://svn服务器地址/项目路径 

clone后面加上svn的地址就行了,但是也可以加一些参数,但是我对此不是很懂,所以没有使用,有需要则需要更细致的查看git的官方文档.

要注意的是大概率会弹出一个弹窗要求你信任证书

因为如果 SVN 是 HTTPS 且有自签证书,会提示信任证书,选择 t (临时) 或 p (永久信任)。

然后要求你输入你的svn账号密码.

参数说明:

参数含义
--no-metadata不保留 git-svn 内部元数据
--authors-file使用刚才的作者映射表
--stdlayout如果 SVN 仓库有标准目录结构(trunk/branches/tags)可以加上


五、离线开发与本地提交

Git 的好处就是,即使没网,也可以这样:

git add .
git commit -m "第一次离线开发提交"
git commit -m "第二次离线开发提交"

不用担心 SVN 连接失败。

你可以使用GUI工具,我上面提到博客也对此有说明.


六、恢复网络后同步回 SVN

先拉取一下 SVN 最新:

git svn fetch

然后同步你的历史提交:

git rebase remotes/git-svn
git svn dcommit

这样,你所有本地 Git 提交,会逐个同步回 SVN。

这里要提一下:这个由svn迁移的git仓库内部仍保持着对原来svn服务器的联系,所以你仍然可以更新或推送代码.所以这里的需要专门的命令(如 git svn dcommit而不是git commit)


七、推送到云端 Git 仓库

如果你还想同步备份到云 Git 仓库(比如 Gitee、GitHub、GitLab):

git remote add origin https://你云端Git地址.git
git push -u origin master

-u的意思是将名为origin的仓库设为默认推送或拉取的仓库

以后想同步:

git push
git pull

此时SVN中心服务器和Git云服务器都能和你这个仓库交互.

 其实这里我还遇到一个问题:我本想使用gitee作为我的云,但是遭遇了推送失败,原因是免费版本的云服务器限制单个文件要小于100MB,很不巧我的项目的历史提交中包含这么大的文件,所以我没法使用gitee,没办法我临时搭建一个自己的git服务器,我以前使用过gitea,轻量强大

Gitea简单部署:

https://github.com/go-gitea/gitea

从发布版里面找windows的64版本,下载下来就行了(我是临时用用,建议从官方文档查看规范的部署流程).

 

下载下来后,放在一个专门的目录下就完成了(这个目录就是你的服务器了) ,此时启动该exe

我的理解本质就是一个大的后端项目,访问该地址(ctrl+左键)

要求数据库,我选择SQLite,这样我不需要部署数据库,公司名填一下就可以安装了

 

默认第一个注册用户是管理员,后续操作和Github没有太大差别. 


八、日常双轨工作流建议

场景命令
从 SVN 拉取更新git svn fetch
把本地改动同步到 SVNgit svn dcommit
离线开发git commit
推送云端 Gitgit push origin master
拉取云端 Gitgit pull origin master

九、常见问题

1. SSL 证书错误怎么办?

SVN 自签证书的话,第一次拉取时会弹出信任确认,选 tp


2. 推送到 Git 报错:remote contains work that you do not have locally?

远程仓库可能有默认 README、.gitignore,你先:

git pull origin master --rebase

然后再推:

git push

3. 有没有办法以后彻底脱离 SVN?

可以,后续可以做一次仓库“脱 SVN 清洗”,删掉 .git/config 里的 svn-remote 部分,然后强制推送纯 Git 历史。

http://www.dtcms.com/a/264010.html

相关文章:

  • 技术学习_人工智能_1_神经网络是如何实现的?
  • 【算法】动态规划 斐波那契类型: 740. 删除并获得点数
  • Vue 3.x 使用 “prerender-spa-plugin ” 预渲染实现网站 SEO 优化
  • 读Vista
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月1日第125弹
  • 数据结构学习——图
  • AiPy +创宇智脑 MCP+Doubao-1.6:IP 风险调查效率显著提高
  • 顶级SCI极光优化算法!PLO-Transformer-GRU多变量时间序列预测,Matlab实现
  • 借助工具给外语视频加双语字幕的实用指南​
  • 【Maven 】 <resources> 配置中排除 fonts/** 目录无效,可能是由于以下原因及解决方案:
  • 坚石ET ARM加密狗复制模拟介绍
  • gis服务器geoserver的下载与安装
  • 分布式爬虫数据存储开发实战
  • 开源模型应用落地-OpenAI Agents SDK-集成Qwen3-8B-探索input_guardrail 的创意应用(五)
  • WPF学习笔记(19)控件模板ControlTemplate与内容呈现ContentPresenter
  • 电子面单系统开发全解析
  • 创建对象的步骤
  • docker desktop部署本地gitlab服务
  • JVM 知识点
  • 数据结构day7——文件IO
  • MapReduce分布式计算框架:从原理到实战
  • 7.可视化的docker界面——portainer
  • 基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战
  • 【C++】备忘录模式
  • 简单聊聊 Flutter 在鸿蒙上为什么可以 hotload ?
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
  • 软件测试-持续集成
  • 嵌入式开发:主频与晶振详解
  • Qt自定义外观详解
  • 24年秋季快手笔试题