使用svnimporter将CVS转为SVN

作者:扬州鹤
来自:iUseSVN.com

环境:
操作系统               Linux RH AS 4
cvs                       1.11.22
repository位置       /data/cvs/cvsrepo

目标:将仓库cvsrepo导入到本机的svn仓库/data/svnrepos/test

采用工具:svn-importer-1.1-M8
下载地址:Importer for SVN by Polarion

操作策略:由于svn-importer采用的导出方式类似于数据仓库中的ETL
即抽取转化装载过程,总体思路分三步走。

抽取的过程是采用jar包封装的cvsclient,协议使用pserver,这样就保证了得到的源数据是准确的
不同于某些直接读取cvs仓库格式的工具,使得抽取过程可以扩展到其他版本控制工具,
事实上svn-importer也已经扩展了N多其他常见的版本控制工具

转换的过程是怎样的,我并不清楚,只知道转换后的结果是一个标准输出的字节流,如果将这个字节流存储为文件的形式,那个这个文件的格式和我们使用svnadmin dump 得到的文件格式是相同的。
事实上,抽取和转换的过程在我们看来是不可分割的。

装载过程其实就是svnadmin load,源是上文说的字节流,也可以是相应的dump文件
目的地就是svn仓库。
装载过程是可以和前两步分开的,也可以合在一起执行。

我采取的策略就是分开执行,先得到dump文件,然后自己手工执行svnadmin load

操作模式: SVN Importer有3种操作模式:完整、增量和列表。

QUOTE:

完整模式用于将源VCS的版本库数据全部导出;
增量模式则用在第一次的完整模式之后,导出新增加的数据;
列表模式只将要导出的数据显示出来,不实际导出。

我也来说两句 查看全部回复

最新回复

  • 维护者 (2008-9-26 15:51:17)

    1  修改配置文件
        svn-importer是通过读取配置文件来决定执行方式的,能否成功的关键就是配置文件是否正确
        下面我结合自己的实际过程说一下主要需要注意的配置参数,一般是config.properties文件

    # Provider settings

    QUOTE:

    srcprovider=cvs           设置源vcs是什么系统,可以是cvs、cvsrcs、pvcs、vss、cc、mks等,我此处是cvs
    # Import options

    QUOTE:

    import_dump_into_svn=no       是否将第三步和前两步连起来,我这里选择no
    existing_svnrepos=no          当import_dump_into_svn设置为yes时,如果这个选项也设置为yes,那么只有svn的仓库已经存在,数据才能导入到svn的仓库中
    clear_svn_parent_dir=no       如果这个被设为yes,并且import_dump_into_svn也设为yes,在导入数据之前,程序会删除所有在svn仓库父目录下的东东 (只在完整模式下才有用)
    use_only_last_revision_content=no             如果设为yes,则只导出源VCS的最后一个版本的内容

    下面这些文件,都既可以是以相对路径指定的,又可以是以绝对路径指定的
    full.dump.file=/data/cvs/full_dump.txt          选择full方式dump,这个参数就会起作用,表示dump的结果文件
    incr.dump.file=incr_dump.txt                    增量模式时生成的DUMP文件路径
    incr.history.file=incr_history.txt              历史文件路径,这个文件在第一次完整模式时生成,以后使用增量模式时需要读取其内容
    list.files.to=src_type_file.txt                 列表模式,这个是指定第一步从源VCS系统取出的内容,还转化成svn的dump文件前的东东
    dump.file.sizelimit.mb=0                        dump文件大小限制,0表示无文件大小限制
    # Debug options

    QUOTE:

    disable_cleanup=no                                   如果这个设置为yes,则从源VCS系统导出的临时文件不会被删除
    # SVN dump options

    QUOTE:

    trunk_path=trunk
    branches_path=branches
    tags_path=tags
    svnimporter_user_name=SvnImporter           产生第一个版本的用户
    only_trunk=no           是否只有trunk,如果选是,则只有trunk文件夹被导出到dump文件,branches和tags目录会被忽略
    # SVN options          svn环境,只有import_dump_into_svn为yes的时候才起作用

    QUOTE:

    svnadmin.executable=c:/svn/svnadmin.exe    svnadmin工具的位置
    svnadmin.repository_path=c:/SVN            将被导入的目的仓库的路径
    svnadmin.parent_dir=.        dump出来的文件将被导入的目录,相对于仓库内的路径,.表示仓库的根目录,其他值则为相对于仓库根目录的子目录,该目录将作为导入内容的父目录
    svnadmin.tempdir=c:/temp/local                   临时目录
    svnclient.executable=c:/svn/svn.exe             svn客户端工具的位置
    svnadmin.verbose_exec=no                         如果设置为yes,则所有执行的svnadmin命令将被显示到终端
    # CVS options           源版本控制系统的参数,必须设置正确,否则将报错,除了第一项和最后一项都要好好设置

    QUOTE:

    username
    password   不用多说,此处注意需要一个对欲导出仓库有写权限的用户,只读是不行的导出过程中需要对文件lock,仔细设置你的cvs.username=,cvs.password=,cvs.hostname=,cvs.repository=
    确保下面的命令能够执行,实际输入参数的时候不要带引号,则这四个参数设置就没有大问题                                
    cvs.class=org.polarion.svnimporter.cvsprovider.CvsProvider
    cvs.username=user
    cvs.password=pass
    cvs.hostname=localhost
    cvs.repository=/data/cvs/cvsrepo      cvs仓库位置,一般和CVSROOT环境变量的值相同,但也不完全如此
    cvs.modulename= project_name          要导出的工程(或目录),*表示全部
    cvs.tempdir=/tmp/cvs                  临时文件夹
    # Log options                                               日志记录,一般无需修改

    QUOTE:

    log4j.rootLogger=DEBUG, stdout
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=svnimporter.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %5p %c{1}:%L - %m%n
    log4j.appender.historyFile=org.apache.log4j.FileAppender
    log4j.appender.historyFile.File=history.log
    log4j.appender.historyFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.historyFile.layout.ConversionPattern=%m%n
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%c{1}:%L %5p - %m%n
    这些都可以结合自己的实际情况进行修改配置,也可以选择默认。
  • 维护者 (2008-9-26 15:52:37)

    2,执行命令

         方式有两种

         一是直接在终端输入命令行,参数可以是没有,一个两个或三个

         java -jar svnimporter.jar arg1 arg2 arg3

         当没有参数时,将显示usage

         第一个参数必须是如下几个之一,full,incremental,list;help,version

         使用help和veriosn时,只要一个参数就可以了

         使用其他三个时,必须使用第二个参数,第二个参数指定配置文件的路径

         第三个参数是可选参数,为最后一个版本的时间,如果指定了,则要导出该时间之前的版本

         格式为YYYY-MM-DD'T'hh:mm:ss

            YYYY - year
            MM - month
            DD - day in month
            hh - hour (1-24)
            mm - minutes
            ss - seconds
          

          第二种方式是,如果是windows系统,可以直接执行run.bat arg1 arg2 arg3
           linux 系统可以自己编写run.sh

           内容为
           java -jar svnimporter.jar $1 $2 $3
           然后chmod 755 run.sh
           ./run.sh arg1 arg2 arg3



    3,svnadmin load SVNREPO_PATH <full_dump.txt
       将dump得到的文件load进svn仓库