34.2.3 提交说明乱码问题
CVS的提交说明中如果使用了中文,在转换后的版本库中可能显示为乱码,这是因为CVS的提交说明没有使用UTF-8字符集。前面提到过,最好先进行小规模的试验性转换,然后再对整个版本库进行正式的转换,就是为了防止在匆忙转换后发现提交说明中出现乱码。
下面来看一个使用了中文提交说明的CVS版本库。版本库是按如下方式部署的:CVSROOT为/cvshome/user,需要将之下的jiangxin/homepage/worldhello转换为一个Git版本库。先检查一下版本库中的数据,找出典型的目录用于转换。
典型的数据是这样的:包含中文文件名,并且日志中包含中文。例如在版本库中,执行CVS查看日志命令,可以看到类似下面的输出。
RCS file:/cvshome/user/jiangxin/homepage/worldhello/archive/2003/.mhonarc.db,v
Working file:archive/2003/.mhonarc.db
head:1.16
branch:
locks:strict
access list:
symbolic names:
keyword substitution:kv
total revisions:16;selected revisions:16
description:
revision 1.16
date:2004-09-21 15:56:30+0800;author:jiangxin;state:Exp;lines:+3-3;commitid:c2c414fdea20000;
<D0><U+07B8><C4><D3>?<FE><B5><D8><A3><BB>
<D0><U+07B8><C4><CB><D1><CB><F7><D2><FD><C7>棻
此版本库之前用CVSNT维护,默认字符集为GBK,所以会在使用UTF-8字符集的操作系统上看到乱码。那么这里选取提交说明存在乱码的目录进行一次试验性的转换,具体操作过程如下。
(1)调用cvs2git执行转换,产生两个导出文件。这两个导出文件将作为Git版本库创建时的导入文件。命令行用了两个—encoding参数设置编码,会依次尝试将日志中的非ASCII字符转换为UTF-8字符。
$cvs2git—blobfile git-blob.dat—dumpfile git-dump.dat\
—encoding utf8—encoding gbk—username cvs2git\
/cvshome/user/jiangxin/homepage/worldhello/archive/2003/
(2)成功导出后,产生两个导出文件,一个保存各个文件的各个不同版本的数据内容,即在命令行指定的输出文件git-blob.dat。另外一个文件是上面的命令行指定的git-dump.dat,用于保存各个提交的相关信息(提交者、提交时间、提交日志等)。可以看出保存文件内容的导出文件(git-blob.dat)相对更大一些。
$du-sh git*dat
9.8M git-blob.dat
24K git-dump.dat
(3)创建空的Git库,使用Git通用的数据迁移命令git fast-import将cvs2git的导出文件导入到版本库中。
$mkdir test
$cd test
$git init
$cat../git-blob.dat../git-dump.dat|git fast-import
(4)检查导出结果。
$git reset HEAD
$git checkout.
$git log-1
commit 8334587cb241076bcd2e710b321e8e16b5e46bba
Author:jiangxin<>
Date:Tue Sep 21 07:56:31 2004+0000
修改邮件地址;
修改搜索引擎;
很好,导出的Git库日志中,中文乱码问题已经解决。但是,提交日志中的Author对应的提交者不完整:缺乏邮件地址。这是因为CVS的提交者仅为用户登录ID,而Git的提交者信息还要包含邮件地址。cvs2git提供用户名映射的方法,不过不能使用命令行调用cvs2git,而是要通过加载配置文件来运行。因此正式进行的CVS到Git版本库转换要采用下面介绍的转换方法。