作者:扬州鹤
来自:iUseSVN.com
环境:
操作系统 Linux RH AS 4
cvs 1.11.22
repository位置 /data/cvs/cvsrepo
目标:将仓库cvsrepo导入到本机的svn仓库/data/svnrepos/test
采用工具:svn-importer-1.1-M8
操作策略:由于svn-importer采用的导出方式类似于数据仓库中的ETL
即抽取转化装载过程,总体思路分三步走。
抽取的过程是采用jar包封装的cvsclient,协议使用pserver,这样就保证了得到的源数据是准确的
不同于某些直接读取cvs仓库格式的工具,使得抽取过程可以扩展到其他版本控制工具,
事实上svn-importer也已经扩展了N多其他常见的版本控制工具
转换的过程是怎样的,我并不清楚,只知道转换后的结果是一个标准输出的字节流,
如果将这个字节流存储为文件的形式,那个这个文件的格式和我们使用svnadmin dump 得到的文件格式是相同的。
事实上,抽取和转换的过程在我们看来是不可分割的。
装载过程其实就是svnadmin load,源是上文说的字节流,也可以是相应的dump文件
目的地就是svn仓库。
装载过程是可以和前两步分开的,也可以合在一起执行。
我采取的策略就是分开执行,先得到dump文件,然后自己手工执行svnadmin load
操作模式: SVN Importer有3种操作模式:完整、增量和列表。
完整模式用于将源VCS的版本库数据全部导出;
增量模式则用在第一次的完整模式之后,导出新增加的数据;
列表模式只将要导出的数据显示出来,不实际导出。
操作步骤:
1 修改配置文件
svn-importer是通过读取配置文件来决定执行方式的,能否成功的关键就是配置文件是否正确
下面我结合自己的实际过程说一下主要需要注意的配置参数
# Provider settings
srcprovider=cvs 设置源vcs是什么系统,可以是cvs、cvsrcs、pvcs、vss、cc、mks等,我此处是cvs
# Import options
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的最后一个版本的内容
# File options 下面这些文件,都既可以是以相对路径指定的,又可以是以绝对路径指定的
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
disable_cleanup=no 如果这个设置为yes,则从源VCS系统导出的临时文件不会被删除
# SVN dump options
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的时候才起作用
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 源版本控制系统的参数,必须设置正确,否则将报错,除了第一项和最后一项都要好好设置
username,password不用多说,此处注意需要一个对欲导出仓库有写权限的用户,只读是不行的
导出过程中需要对文件lock
仔细设置你的cvs.username=,cvs.password=,cvs.hostname=,cvs.repository=
确保下面的命令能够执行,实际输入参数的时候不要带引号,则这四个参数设置就没有大问题
cvs -d :pserver:'cvs.username':'cvs.password'@'cvs.hostname':'cvs.repository' login
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 日志记录,一般无需修改
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
这些都可以结合自己的实际情况进行修改配置
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仓库
对于仓库中中文路径和文件名未做测试
检验,收工。
转帖请包含作者等版权信息、并注明来自:我用Subversion - 使用svnimporter将CVS转为SVN

#1

