项目如何从 SVN 迁移到 Git
为什么80%的码农都做不了架构师?>>>
#0 系列目录#
- 版本管理
- SVN版本管理:场景命令实战
- SVN版本管理:两种开发模式
- GIT版本管理:场景命令实战
- GIT版本管理:Git Flow模型
- 项目如何从 SVN 迁移到 Git
很多有点历史的项目,都是用的 Subversion 作为版本控制工具的,随着项目需要,很多团队就打算采用 Git 作为替代工具了。好,现在问题来了:项目如何平滑的从 Subversion 迁移到 Git
。
这里所谓的迁移是按照版本控制要求来迁移,包括:
尽可能完整的由谁提交的代码、做出的代码变更记录,提交日志等。
尽可能完整的分支、标签等。
因为毕竟是不同的版本控制工具,转化过程难免会有瑕疵。
#1 准备环境# 安装用到的工具的软件包,这里以 Ubuntu 为例:
$ sudo apt-get install subversion git
$ sudo apt-get install git-core libsvn-perl perl libterm-readkey-perl
#2 规范 Subversion# 确认项目的 Subversion 地址:
# 后面统一用 $PROJECT 表示项目的 Subversion 地址
# 这里的示例项目名称是 west
https://scms.example.com/svn/projects/west/
规范项目在 Subversion 的目录结构:
标准的 trunk、branches、tags 目录布局。
branches 和 tags 目录下的分支和标签保持平级,例如:
tags/v1.0.0 可以。
tags/1.x/v1.0.0 多了层目录就不可以。
如果不是平级,以 tags 为例,先执行 svn mv 操作。
方式 1 - 远程 svn mv
$ svn mv $PROJECT/tags/1.x/v1.0.0 $PROJECT/tags/v1.0.0
方式 2 - 本地 svn mv
$ svn co $PROJECT west_subversion
$ cd west_subversion
$ svn mv tags/1.x/v1.0.0 tags/v1.0.0
最后规范后的目录示例如下:
west
├── trunk
│ ├── docs
│ ├── west
│ ├── setup.py
│ └── README.rst
├── branches
│ ├── hotfix_add_user_error
│ ├── hotfix_issuse_9527
│ ├── feature_unittest4app
│ └── feature_multi_add_user
└── tags├── v1.0.0├── v1.0.1├── v2.0.0└── v2.1.0
#3 生成提交者 ID 和邮箱#
- example.com代表组织的邮箱,比如:knownsec.com
- 但如果个人邮箱不是统一的组织的话,就需要手工编辑 users.txt 了
svn log $PROJECT --xml | grep -P "^<author" | \sort -u | perl -pe 's/<author>(.*?)</author>/$1 = $1 <$1@example.com>/' > users.txt
#4 迁出项目代码(git svn)#
git svn clone $PROJECT --authors-file=users.txt --no-metadata --localtime --stdlayout
--authors-file 是得到的 git log 提交记录映射好提交者的信息;
--no-metadata 是得到的 git log 不带上对应的 Subversion 信息了,更干净;
--localtime 是得到的 git log 以本地时间为准,建议用上;
--stdlayout 是先前准备的按规范目录风格来迁出代码;
#5 转化成Git的仓库格式(tags 和 branches)# 处理 tag:
git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
处理 branch:
git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done
#6 一些清理工作# 由于这个转化会将及历史上的 branches 和 tags 也都生成一个 Git 的分支和标签,所以还是得清理下你认为不用的分支和标,可能包括:
Subversion 历史上错误的 tags。
Subversion 历史上临时的 branches。
冗余的 trunk 分支(其实跟转化后的 Git master 分支一样)。
#7 添加到远程 Git 仓库#
- 比如:GitHub 上创建项目 west
- 添加本地 Git 项目到刚创建的远程 Git 仓库
git remote add origin git@github.com:akun/west.git
git push origin --all
git push origin --tags
#8 完成迁移# 这样,可以直接在 Git 下来继续你的项目了。
git clone git@github.com:akun/west.git
#9 遗留问题# 上述方式转化其实还有瑕疵,比如:
Subversion 允许空目录,转化 Git 用 git svn,处理空目录带上 --preserve-empty-dirs 可能会报错,不处理,可能项目的程序原先依赖空目录的处理就得修改。
类似 svn:externals,svn:ignore,svn:merge 等属性丢失
不过问题不大,可以接受,Subversion 迁移 Git 算是基本平滑迁移。
转载于:https://my.oschina.net/xianggao/blog/667048
项目如何从 SVN 迁移到 Git相关推荐
- SVN迁移到Git的过程(+ 一些技巧)
SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...
- SVN迁移至GIT,并附带历史提交记录
文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展,GIT逐渐取代SVN成为主流的版本管理工具,部门的项目代码也决定迁移至git进行 ...
- 从SVN迁移到Git(包括SVN历史纪录)【最系统的讲解】
从SVN迁移到git有很多方法,最简单的就是使用git包自带的git svn命令(git v1.7及以上).除此之外还有一些第三方的专门的转换工具如http://www.subgit.com/,htt ...
- Git学习文档之二 应用总结-svn迁移到git
##svn迁移到git 在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中.如果想让这条信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 G ...
- Gitea:从SVN迁移到Git
目录 环境信息 迁移步骤 SVN和Git都是优秀的版本管理工具.不幸的是,对于从SVN迁移到Git的过程.命令和说明,网上不少文章存在误导性.因此本文以Gitea为例,演示从SVN迁移到Git的详细过 ...
- 将项目从 SVN 迁移到 GIT
场景 项目开发中,项目原本是用的SVN,已经用了一年了,现在公司要抛弃SVN用Git,要求把SVN的代码直接搬过去Git,并保留之前的历史提交记录. 操作步骤 找到已经被svn管理的项目的根目录 Wi ...
- 使用subgit进行svn迁移至git(branch,tags)
前言: 最近公司需要将整体项目从svn迁移至gitlab上,经过几天的研究,现记录一下流程 整体思路是进行一次导入: 先通过subgit将svn整个import至本地,在与git上的项目进行合并. 1 ...
- svn迁移到git报Checksum mismatch: TapiParser/jar/tapiParser/tapiParser.jar c7a0bbbcc00e06bf963e4499faf829
由于对git和svn都不是很熟悉,被分到这个任务是很懵的,好在有操作手册跟着操作,没有难度,但是在迁移过程中就报了错: Checksum mismatch: TapiParser/jar/tapiPa ...
- svn迁移到git实际操作(亲测有效)
要把svn项目迁移到git,话不多,直接上 首先svn与git安装好 1.到svn项目目录右键选中gitbash打开窗口,执行获取用户并映射成git样式账号命令如下: svn log -q | awk ...
最新文章
- silverlight带有复选框的列
- 安全篇之手机数字密码九宫格究竟哪个更安全?
- Yahoo 拒绝 Microsoft 的收购请求
- 别再搞纯文本了!多模文档理解更被时代需要!
- [Ajax] 案例 -- 三级联动
- php wmi,wmi与vbs
- Hibernate存取JSON数据
- Snagit--高难度、多功能截图,有了它截图不求人!
- WebBrowser无法显示招商银行密码输入控件的问题
- 数据结构导论【五】之 图
- 大数据,云计算,人工智能之间的关系
- 阿里云数据库与自建数据库的性能对比
- FZU1892接水管游戏-BFS加上简单的状态压缩和位运算处理
- 【技术贴】禁止打印进程spoolsv - spoolsv.exe随机启动
- java默认字体_设置 Java 系统的默认字体
- 计算机主板会自动切断电源是怎么回事,主机启动一秒又自动断电一直循环 就只擦内存条...
- Partially written block detected 疑问及解决办法
- Solana 基金会与韩国区块链孵化器 ROK Capital 合作推出 2000 万美元生态基金
- Mapbox学习笔记(1)——style
- 辰华宏命令(Macro Command)使用说明
热门文章
- Realtime Ray Tracing RenderMan Point Cloud
- Query-digest-UI监控慢查询,以及此工具的改进版
- 《Node.js 入门系列》—— 一些简单的排错方法(一)
- Python变量的复制
- SGU 160.Magic Multiplying Machine
- 《黑书》hdu1271递推习题:整数对
- 关于梦想--------听说标题够长才有人看
- 【转载】 quartus中调用modelsim仿真的方法
- 环境在c盘_如何给女朋友解释为什么 Windows 上面的软件都把自己安装在 C 盘
- python的常量和变量_python变量和常量