CVS迁移到SVN

  去年刚入职现所在公司时,做过一个CVS->SVN迁移,SVN库大概1.8G左右,花了不少时间处理。由于急着迁移并未做好笔记,导致这次迁移另外一个1.5G的项目有点束手无策,好歹之前有经验也有教训,特做下笔记。

环境说明:

CVS在一台linux服务器上,SVN在另外一台linux服务器上,项目大概1.5G左右(多年项目,积累了较多tag及文档)。

辅助环境:XP,Ubuntu

需要工具:python,cvs2svn (python支撑cvs2svn运行,一般发行版linux都已经包含python)

步骤:

1、先通知参与项目人员,将必要的代码提交,因为自迁移工作开始,CVS的使命也基本完成了,如果漏了一些最新本地副本的提交将人为导致迁移出现一些问题。

2、为加快迁移速度,多年沉积下来的版本控制里,像release备份,一些图片等文档,没必要迁移历史,确定哪些不必要迁移(后续人工处理)。这一步将项目所在的CVS库目录tar打包,不需要进行压缩(文件过多,压缩花的时间得偿失)。打包的目的是方便取到本地,清除一些不必要迁移的数据,暂时移除一些不需要迁移历史的数据。

3、将tar取到本地并处理好后,就需要将它放到linux(windows下也能完成,但个人更喜欢在linux操作)。从windows下将tar放到linux上,并解压缩,有可能会有中文文件乱码情况,这里的解决方法有几种:1)使用rar包。2)修改linux系统上的字符编码为gbk/gb2312,如果在linux上看到的中文目录或文件名正常了,那就可以进行接下来的操作了。

4、也是最重要的一步,将CVS库导出成SVN DUMP文件。

4.1、为保证迁移到SVN的中文目录及中文文件名都正常,可以从解压的CVS文件夹里,复制一个包含中文目录及中文文件名的目录出来,并在它下面建立一个名为CVSROOT的目录,然后使用cvs2svn导出成SVN DUMP文件。假设这个测试的CVS目录名为/home/cvst/test,它下面包含中文目录及文件名,那在test下建立CVSROOT空目录,运行命令:

sudo /usr/mysoft/Python/python cvs2svn --dumpfile=/home/littlechang/testChs.dump /home/cvst/test --encoding=gb2312

这里是假设dump文件放在/home/littlechang 下,正常情况控制台会出现日志,注意看日志中第一个处理步骤pass1 中处理到中文文件名及目录是否正常,如果不正常,请在命令的最后再加上 --encoding=utf-8 即两个encoding参数,继续进行测试,如果不行再换编码直到成功。 4.1输出的日志样例见本文尾。

4.2、完成中文测试通过后,得到了testChs.dump文件,这时为安全起见,将它加载到svn中去。假设新svn库在/home/svn/myProject(命令:svnadmin create /home/svn/myProject)下,注意这个版本库里不要包含trunk,branchs,tags 三个目录,如有请清除(例如可在tortoisesvn中将其删除)。

使用命令:svnadmin load /home/svn/myProject</home/littlechang/testChs.dump

运行后,会提示开始处理,如不出现异常信息则表示成功。

4.2输出的日志样例见本文尾。

4.1输出日志样例:

Time for pass1 (CollectRevsPass): 267.4 seconds.
----- pass 2 (CleanMetadataPass) -----
Converting metadata to UTF8...
Done
Time for pass2 (CleanMetadataPass): 0.075 seconds.
----- pass 3 (CollateSymbolsPass) -----
Checking for forced tags with commits...
Done
Time for pass3 (CollateSymbolsPass): 0.053 seconds.
----- pass 4 (FilterSymbolsPass) -----
Filtering out excluded symbols and summarizing items...
Done
Time for pass4 (FilterSymbolsPass): 97.07 seconds.
----- pass 5 (SortRevisionSummaryPass) -----
Sorting CVS revision summaries...
Done
Time for pass5 (SortRevisionSummaryPass): 0.163 seconds.
----- pass 6 (SortSymbolSummaryPass) -----
Sorting CVS symbol summaries...
Done
Time for pass6 (SortSymbolSummaryPass): 2.268 seconds.
----- pass 7 (InitializeChangesetsPass) -----
Creating preliminary commit sets...
Done
Time for pass7 (InitializeChangesetsPass): 103.9 seconds.
----- pass 8 (BreakRevisionChangesetCyclesPass) -----
Breaking revision changeset dependency cycles...
Done
Time for pass8 (BreakRevisionChangesetCyclesPass): 20.86 seconds.
----- pass 9 (RevisionTopologicalSortPass) -----
Generating CVSRevisions in commit order...
Done
Time for pass9 (RevisionTopologicalSortPass): 20.90 seconds.
----- pass 10 (BreakSymbolChangesetCyclesPass) -----
Breaking symbol changeset dependency cycles...
Done
Time for pass10 (BreakSymbolChangesetCyclesPass): 55.48 seconds.
----- pass 11 (BreakAllChangesetCyclesPass) -----
Breaking CVSSymbol dependency loops...
Done
Time for pass11 (BreakAllChangesetCyclesPass): 74.64 seconds.
----- pass 12 (TopologicalSortPass) -----
Generating CVSRevisions in commit order...
Done
Time for pass12 (TopologicalSortPass): 74.56 seconds.
----- pass 13 (CreateRevsPass) -----
Mapping CVS revisions to Subversion commits...
Creating Subversion r1 (Project initialization)
Creating Subversion r2 (commit)
……
一直到cvs的最大版本号,期间可以看到tag号也被提交。(cvs,svn tag机制不同)
Creating Subversion r4717 (commit)
Done
Time for pass13 (CreateRevsPass): 64.68 seconds.
----- pass 14 (SortSymbolsPass) -----
Sorting symbolic name source revisions...
Done
Time for pass14 (SortSymbolsPass): 4.683 seconds.
----- pass 15 (IndexSymbolsPass) -----
Determining offsets for all symbolic names...
Done.
Time for pass15 (IndexSymbolsPass): 3.554 seconds.
----- pass 16 (OutputPass) -----
Starting Subversion Dumpfile.
Starting Subversion r1 / 4717
Starting Subversion r2 / 4717
……一直到最大版本号
Starting Subversion r4717 / 4717
Done.
Time for pass16 (OutputPass): 431.2 seconds.

cvs2svn Statistics:
------------------
Total CVS Files:             11061
Total CVS Revisions:         19671
Total CVS Branches:           2852
Total CVS Tags:            1340371
Total Unique Tags:             346
Total Unique Branches:           2
CVS Repos Size in KB:       564984
Total SVN Commits:            4717
First Revision Date:    Tue Aug  1 13:43:51 2006
Last Revision Date:     Fri Sep 10 17:54:27 2010
------------------
Timings (seconds):
------------------
 250   pass1    CollectRevsPass
   0   pass2    CleanMetadataPass
   0   pass3    CollateSymbolsPass
  97   pass4    FilterSymbolsPass
   0   pass5    SortRevisionSummaryPass
   2   pass6    SortSymbolSummaryPass
 102   pass7    InitializeChangesetsPass
  21   pass8    BreakRevisionChangesetCyclesPass
  21   pass9    RevisionTopologicalSortPass
  56   pass10   BreakSymbolChangesetCyclesPass
  76   pass11   BreakAllChangesetCyclesPass
  77   pass12   TopologicalSortPass
  67   pass13   CreateRevsPass
   5   pass14   SortSymbolsPass
   3   pass15   IndexSymbolsPass
 431   pass16   OutputPass
1208   total

4.2输出日志样例:

……省略一些小版本日志输出

这里是svnadmin在将我们dump 文件加载到版本库,它会从第1个版本号开始提交,直到最后一个版本号。

<<< Started new transaction, based on original revision 4713
     * editing path : trunk/webapps/base/op/product/productList4promotionBind.jsp ... done.
     * editing path : trunk/javasrc/baseproject/com/kanmenzhu/LoginAction.java ... done.

------- Committed new rev 4719 (loaded from original rev 4713) >>>

<<< Started new transaction, based on original revision 4714
     * editing path : trunk/javasrc/baseproject/com/kanmenzhu/UserService.java ... done.

------- Committed new rev 4720 (loaded from original rev 4714) >>>

<<< Started new transaction, based on original revision 4715
……
------- Committed new rev 4723 (loaded from original rev 4717) >>>

当最大版本号提交完毕,也就意味着迁移工作的基本完毕。

==================分隔线==============================

在完成4.1,4.2的测试后(之所以要测试,因为如果直接将整个CVS库进行操作,如果中途失败,开销的时间得不偿失,用小目录测试结果一样),访问新的SVN库,查看历史记录等是否正常。如果正常,则对整个CVS库进行迁移,迁移成功的结果应该是:

历史记录完整,包含提交人信息;CVS上的branchs,tags 信息被添加到SVN 的branchs,tags中。

5、完成以上操作后,将之前暂时移出来不需要历史记录的文档进行还原,即提交到新的SVN库。

===============================

猜你喜欢

转载自lydawen.iteye.com/blog/763433