迁移VSS版本库到Git:VSS2Git

jopen 10年前
公司最近有意将版本控制工具从VSS和CVS切换到Git上,由于之前的项目一直是使用VSS和CVS进行版本管理,这次迁移免不了要涉及VSS和CVS版本库向Git进行转换的工作。

带着这个目的,我先尝试着找到VSS到Git迁移的可行方案,因为我之前的项目一直也是用VSS进行版本管理,相对于从没有使用过的CVS而言,应该更容易上手一些。至于CVS如何迁移到Git会在后面进行研究。

之前在学习使用GitStack搭建Git服务器时,在其官方网站上看到一篇讲如何迁移SVN版本库到Git的 文章,文中有提到git svn命令,可见Git内部已经有了对SVN版本库进行操作的支持,继而顺着这个思路,试着去找找有没有支持对VSS和CVS的操作,结果发现Git没有 对VSS的操作支持,对于CVS倒是有git cvsimport,但在Git Bash中却不认识该命令,运行git help vcsimport也没有相关的文档,而使用git help vcs-migration倒是有文档,其中也提到了git cvsimport,难道是我是在Windows上使用的Git(安装的是msysGit 1.7.10),而在Windows上还不支持该命令吗?不知道在Linux上的情况是怎么样的?

这个问题暂时先搁置,先研究一下如何将原有的VSS版本库迁移到Git上。

既然Git没有对VSS的支持,那么VSS转Git应该是需要第三方的工具来帮助实现这个转换工作(该工具要读取并分析VSS仓库的数据,然后按照 Git版本库的内部结构来存放之前VSS版本库中的数据),按照这个思路,在Google上搜索了一下,果然发现有一个这样的工具,那就是vss2git,而且是个开源的项目,很对我的胃口。

下载下来并试用了一下,结果成功将之前的一个用VSS管理的项目转换为Git仓库,并且之前VSS的历史信息也被保留下来,基本是满足了要求。

VSS版本库到Git的迁移

打开VSS2Git,其界面就是一个对话框,在其中作一些必要的设置,主要是设置VSS版本库所在的路径、要转换VSS版本库中哪一个项目(也可以 是整个VSS版本库中全部的项目)、转换结果的存放位置、转换Log存放的位置、转换过程中创建Git提交对象时所需的email的domain等,设置 好这些之后,点击Go按键即可开始VSS到Git仓库的转换。

迁移VSS版本库到Git:VSS2Git

转换所需的时间长短取决于VSS仓库的大小,如果VSS仓库中项目众多,且开发的时间都比较久的话,那么完成整个仓库的转换应该需要的时间会比较长,但如果只是转换其中一个项目到Git,那么时候会比较短。

转换后,通过git log可以看到之前VSS仓库中的历史信息,而且这些历史信息在Git仓库中仍然是按照提交时间的先后来排列的。

在转换过程中,打开存放Git仓库的目录,你会发现工作目录随着时间会在变化,这是因为VSS2Git在转换时会先分析并收集VSS仓库中的各种信息,然后再从VSS仓库中记录的最早的时间点开始Replay(演绎)整个VSS仓库数据形成的过程。

在演绎过程中,应该是先从VSS中取出最初的版本(Git仓库最初为一个空仓库),并将其版本中的文件作为Git工作目录的文件,然后按照Git先 对工作目录进行文件快照再提交到Git仓库的做法,按照时间顺序逐个版本进行提交(提交时会取出VSS中对应版本的历史信息),最终将VSS版本库转换为 Git仓库。

上述的演绎过程是我自己初步推断的大概过程,实际是否这么实现,请参考VSS2Git的源代码(用C#实现的)。另外,VSS仓库内部的数据到底是如何组织的我也没有研究过。

要注意的几点:

  • 如果是要将整个VSS仓库中的所有项目都迁移到Git中,那么在VSS2Git界面的Project一项中填上$

  • 如果只是要将VSS仓库中的某一个项目迁移到Git上,则在Project一项中应填上$/Project1(其中Project1为假设的项目名),甚至可以仅转换子项目,这样$/Project1/32Bit

  • VSS2Git一次要么完成VSS仓库的整体转换,要么只能转换VSS仓库中其中一个项目,这样要实现多个项目的转换就要多次执行VSS2Git

  • VSS2Git的每一次转换会产生一个Git仓库,如果是VSS仓库一次整体转换,则生成的Git仓库中将包含VSS仓库中所有的项目,这样带来的 问题是,由于Git仓库中包含了所有的项目,这样以后不同项目的开发人员无法从Git仓库中只checkout出自己负责的那个项目文件,而是要 checkout出所有项目的文件,这样对于公司的代码安全是非常不利的,那么,这样就不应该一次将VSS仓库整体转换,而是应该以项目为单位进行逐个转 换,这样,对于不同的项目,对其Git仓库就可以为不同的开发人员设置不同的操作权限

  • VSS2Git在生成Git提交信息所需的email时,只是根据从VSS中提取出的User名加上在界面Email domain中填写的内容组合而成,实际生成的email地址未必是有效的(不一定能用来发送email)

更多的注意事项可至VSS2Git的主页查看。

导入现有的Git仓库到GitStack服务器上

通过VSS2Git,我们可以将VSS仓库中的项目逐一转换为该项目的Git仓库,这时我们可以将其放置到Git服务器上了,以便后续的开发和维护。

这里,我们假设使用GitStack搭建了Git服务器(如何搭建见上篇),现在的问题就相当于如何将一个现有的Git仓库导入到GitStack搭建的服务器上。因为正常的流程是在GitStack上先创建裸仓库,然后再向其中提交,如果这样做的话,我们之前的VSS中的历史信息恐怕就要丢失了,而这是我们不希望的结果。

不过幸运的是,GitStack支持导入一个现有的Git仓库到其中,其步骤也很简单,就是先将现有的Git仓库拷贝至C:\GitStack \repositories目录下面,然后登陆到GitStack上,在Repositories列表中会发现我们的Git仓库已经在其中,但 Action栏则出现了一个绿色的安装,而非添加用户、查看仓库的那些按钮,这时我们只有点击这个绿色按钮就完成了该Git仓库的导入,之后我们会发现绿 色的按钮被正常的添加用户、查看仓库的那些按钮替换掉,这时我们就可以为该Git仓库添加用户并设置访问权限了。

迁移VSS版本库到Git:VSS2Git

具体的过程,在GitStack的文档中有详细的阐述,请见Import an existing repository,这里不再赘述。

至此,如何将VSS仓库迁移到Git,并将生成的Git仓库导入到GitStack搭建的服务器上的大概过程就结束了。

(全文完)
来自:http://www.oschina.net/p/vss2git