将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变。虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够用,使用 Git 仍然有如下优势:

  • 类似 GitHub 的 GitLab 免费管理工具。将代码托管在自己内部服务器上的同时,提供了优美的 web 界面,图形化分支结构,更直观的代码审查,统计、issue 系统、wiki 等功能全面集成。
  • 更方便主程做 code review,控制代码质量。创建主仓库,多人开发时使用 fork 模式,每个人拥有自己独立的 repo,独立的 trunk / branches,最后发送 pull request 进行代码合并。
  • commit 和 push 更快。体现在 push 到远程仓库时 Git 会先对所有需要上传的文件进行 zip 打包压缩,然后一次性传输,在远程服务器解压,全部自动完成。而 SVN 则是一个一个文件地上传,代码是纯文本,总体积并不大,但是大量零碎的小文件频繁建立网络连接造成延迟。这在升级第三方的库或者框架时,成千上万的文件更新更加让人难以忍受。
  • hook 可以更方便做自动化部署。当然这个 SVN 也有。

权衡后我决定花时间进行代码仓库的迁移。代码迁移并非简单地创建 Git repo 把当前项目代码一次性 commit 过去就够了,因为 SVN 中存有长年累月的 commit 历史记录,丢失历史记录将对今后追溯 debug 造成非常大的麻烦,所以如何保留 commit 记录就是迁移的关键。

一、迁移步骤

创建用户映射 (例如 users.txt) ,将 SVN 用户和 Git 用户对应起来:

user1 = First Last Name <[email protected]> user2 = First Last Name <[email protected]> …

如果上面的文件中有用户缺失,后面的 SVN 命令将会停止。不过你可以更新用户映射然后接着再来(类似断点续传)。

现在从 SVN 仓库中拉取所有数据:

git svn clone --stdlayout --no-metadata -A users.txt svn://hostname/path dest_dir-tmp

这个命令将会在 dest_dir-tmp 新建一个 Git repo,并开始从 SVN 中拉取代码。请注意 “--stdlayout” 参数表示你的项目在 SVN 中是常见的 “trunk/branches/tags” 目录结构,如果不是,那你需要使用 --tags, --branches, --trunk 参数(请通过 git svn help 自行了解)。

再后面的参数是 SVN 的地址,一些常见协议都是支持的 : svn://, http://, https://. 注意这个 URL 应该指向项目的 base repository,例如 http://svn.mycompany.com/myrepo/repository. 不要指到了 /trunk, /tag/branches 里。

如果出现用户名没找到,更新你的 users.txt 文件,然后

cd dest_dir-tmp
git svn fetch

如果你的项目非常大,你可能需要重复上面的命令好几次,直到所有的 SVN commit 都被抓下来了:

git svn fetch

完成后,Git 将会 checkout SVN 的 trunk 到一个新的 Git branch,而其他的 SVN branch 将会设为 Git remote,你可以查看所有的 SVN branch:

git branch -r

如果你想在你的 Git repo 中保留其他的 remote branch,你需要手动创建本地 branch。否则,SVN 的 branch 将不会在最后被 clone。

git checkout -b local_branch remote_branch
# it‘s ok if local_branch and remote_branch are the same name

SVN tags 被当作 branch 导入了,你需要创建本地 branch,打一个 tag,然后删掉那个 branch,这样才会在 Git 中生成 tag。例如 SVN tag “v1″:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

把上面的 GIT-SVN repo Clone 到一个全新的干净 git repo:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

之前从 remote branch 创建的本地 branch 又会在新 clone 的 repo 中成为 remote branch,于是对每个 branch 再做一次:

git checkout -b local_branch origin/remote_branch

最后,从干净的 Git repo 中删掉 remote (指向我们刚刚已经删掉的 temp repo)

git remote rm origin

这样一个全新 Git repo 就已经从 SVN 迁移好了。

二、新的 Git 远程仓库

将本地的 Git repo push 到远程仓库(我这里用的是 GitLab):

git remote add origin git@git.udev.hk:udba/udba.git
git push -u origin master

push 所有的 branch:

git push origin --all

push 所有的 tag:

git push origin --tags

最后再放两张 GitLab 的截图

在线阅读代码

图形化统计数据

– EOF –

http://www.lovelucy.info/codebase-from-svn-to-git-migration-keep-commit-history.html

时间: 2024-07-31 09:35:54

将代码库从 SVN 迁移至 Git 并保留所有 commit 记录的相关文章

坑死人不偿命,svn 迁移到 git

用git的人非常鄙视用svn的.因为要不断的开分支.而且也没有本地的分支这个概念. 但是git 作为一项技术,是一定可以被svn替代的.当然替代的方法是否繁琐另当别论,但一定是能被替代.svn同样也能被git替代.大概所有的技术都是一样.都能相互替代,只是你要为替代本身花费多长时间. git作为一种同步工具好用吗?其实真不好用.我梦想的工具一定是可以帮我自动完成merge过程的,永远不用开分支,永远不用告诉我链表头在哪里,以及怎么reset, 什么时候rebase, 什么时候打tag. 一个工具

SVN迁移到Git的过程(+ 一些技巧)

SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问. 阅读本篇文章,请先有一些Git和SVN的使用经验(又是经验,经验到底是什么?我都不知道). 第一部分   今天的实验对象是,把 http://code.g

svn迁移到git

最近需要将项目从svn迁移到git,至于原因请忽略,至于svn与git区别优劣请自行百度.一共有两种方式可行: 第一种方式较为常见,但是会丢失之前svn版本提交记录,就是将svn checkout到本地然后上传到git上 详情参见:http://blog.csdn.net/hanhailong726188/article/details/46738929 第二种方式较为复杂,但是可以保留之前svn版本提交记录,执行命令如下: git svn clone https://172.16.0.241:

SVN迁移到Git的过程(+ 一些技巧

关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文章,请先有一些Git和SVN的使用经验(又是经验,经验到底是什么?我都不知道).  第一部分 今天的实验对象是,把http://code.google.com/p/jdbcdslog-exp/ 这个使用SVN管理的project迁移到Git上面,Git托管网站选择github.SVN迁移到Git,当

svn迁移至git

svn 版本库的迁移,只要svn 库为标准目录(trunk.branches.tags)按照git官方文档基本都可以完成. 这里说说我所迁移的非标准目录结构的svn 库 svn 库里有part1目录,part1目录下又分为:code.UI等等,对于这种非标准目录结构,主干就是part1,没有分支,没有标签. 而code下面又分为android.ios目录,目录内才分trunk.tags.branch,这种目录层级结构-- 对于以上非标准目录结构,我采用的是先git svn到本地,并提交到git仓

使用git checkout 指定git代码库上的指定分支

由于以前一直是在用svn,到狼厂,大家都用Git.哥的开发环境:IntelliJ 说说简单的操作过程吧. 1.检出Git代码库 cd到指定目录 git clone http://..../android.git clone远程的代码到本地 2.git branch -r 展示该Git库下的所有branch 3.git checkout -b master_3.0 这里的master_3.0是上一步中branch列表中的origin/master_3.0,也是我们想check出来的分支. 常用Gi

Gitolite如何导入其它git代码库

续上节,我们配置了<ubuntu Gitolite管理git server代码库权限> 在这里测试下Gitolite如何导入其它git代码库 要求:原服务器有sdk.git项目,我们导入到Gitolite并配置权限管理. 停止原服务器对sdk.git的操作,将代码库直接打包 [email protected]:/git$ tar -zcf sdk.tar.gz sdk.git 将sdk.tar.gz传到Gitolite服务器,我传到/tmp下面 Gitolite管理服务器上执行 先添加同名的项

从VSS到SVN再到Git 记Git的基本操作

Source code control 一直是软件开发过程中重要的环节,从最初的纯文件备份,到使用工具进行管理.Source code control 工具的作用也不仅仅只是单纯的对同一个版本进行管理了.从目前主流的source code control工具当中不难发现里面的Branch, tag等功能的应用场景越来越多,特别是现在多数企业使用的敏捷编程,结合branch和tag等功能真的能够很好的做到多版本开发,快速迭代. 思考: 没有source code control我们如何快速的基于一

源代码管理——git(分布式版本控制和集中式版本控制对比,git和SVN对比,git常用指令,搭建GitHub远程仓库,搭建oschina远程仓库 )

一.git简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的 git的起源 作者是Linux之父:Linus Benedict Torvalds 当初开发git仅仅是为了辅助Linux内核的开发(管理源代码) git的现状 在国外已经非常普及,国内并未普及(在慢慢普及) 越来越多的开源项目已经转移到git CVS 最早的开源.免费的集中式版本控制工具 自身设计有问题,会造成提交文件不完整,版本库莫名其妙损坏的情况 SVN