p4convert 指南

什么是p4convert ?

p4convert转换工具从Subversion或CVS导入数据,并在Perforce中重新构建文件修订历史。

对于CVS,数据是从CVSROOT读取,而对于Subversion,数据是从转储文件读取。

数据以两种方式之一添加到Perforce:

导入模式(前门)

修订被导入到运行的性能服务器中。Perforce服务器可以是新的或包含现有数据,但它必须是运行的。按顺序添加 Subversion 版本,文件内容被“导入”,元数据如文件属性、描述、日期和用户名被添加到Perforce变更列表中。CVS数据根据可用的元数据(如日期/时间、作者、更改描述和文件操作)被分类到变更列表中。

导入模式的推荐使用是启动一个新的Perforce服务器,将每一组更改导入到一个Perforce changelist中。使用这种方法将产生一个Subversion修订号到Perforce变更列表的一对一映射,以及一组可重复的CVS变更。新的Perforce服务器可以单独使用,以确认迁移的成功,然后使用PerfMerge++工具与现有的Perforce服务器合并。

转换模式(后门)

修订被完全转换,创建一个Perforce日志和一组存档文件。一旦重播,所产生的转换就好像这些变化一直都是被迫的。使用PerfMerge++工具,可以将结果合并到现有的Perforce服务器中。导入模式被认为是最安全的方法,因为所有文件都是通过Perforce客户端导入的。转换模式要快得多,但是需要理解Perforce数据库管理。

转换模式是一种高级功能,只有熟悉重复播放和升级数据库的Perforce专家才能尝试。使用转换模式不支持增量转换;但是,可以在转换模式转换之后使用导入模式来更新迁移。

递增更新(前门)

增量Subversion更新只能使用导入模式,在这种模式中,从Subversion导入新的修订到Perforce。但是,不能更改Perforce服务器的导入区域,否则可能会发生冲突。

无论是导入模式还是转换模式,当前都不支持增量CVS导入。

第1章 设置

系统需求

  1. [SVN] 要转换的存储库的一个解压缩的Subversion转储文件 (生成时没有使用 --delta 标签).
  2. [CVS] 一个解压缩的CVSROOT目录,其中包含要转换的存储库的RCS文件。
  3. 系统必须有Java SE运行时7或更高。
  4. 系统必须具有Perforce Server二进制文件2010.2或更高。
  5. [Import Mode] 正在运行的Perforce服务器(通常为空),在转换区域中没有挂起的更改。
  6. [Convert Mode] 生成的归档文件和日志文件的一个空的Perforce根目录。

资源建议

运行一些转换(特别是在转换模式下)可能会占用大量内存,因为修订和集成的映射保存在内存中。对于大型转换,或具有过多分支的转换,JVM将需要更多内存。

--info 选项将扫描Subversion转储文件并报告使用数据,以帮助估计转换模式所需的内存。

例如:

java -jar p4convert.jar --type=SVN --repo= --info

使用 -Xmx 标签增加分配给JVM的内存。

例如,分配64GB (65536MB)使用:

java -Xmx65536M -jar p4convert.jar --config=myConfig.cfg

警告

  1. 下表列出了经过测试的操作系统和性能服务器版本的组合。

    Operating System 10.2 14.1
    Ubuntu 10.04 supported supported
    Darwin 11.4.0 supported supported
    Windows 7x64 supported supported
    SunOS 5.10 supported supported

    其他的组合可能也会起作用,但是不可能测试所有的组合。如果您对操作系统或版本有任何疑问,请联系Perforce。

  2. [Import Mode] 在Windows的导入模式中不支持符号链接。

  3. Perforce关键字扩展不同于Subversion标准,可能在同步时产生不同的结果。还不支持CVS关键字检测。

设置和使用

从Perforce下载自包含的JAR,并检查Java SE运行时是否安装了版本7或更高版本。

要了解使用细节,请执行不带选项的jar:

usage: java -jar p4convert.jar-c,--config <arg> Use configuration file-d,--default Generate a configuration file-E,--end <arg> End revision, for incremental (SVN)-e,--extract <arg> Extract a revision-i,--info Report on repository usage-r,--repo <arg> Repository file/path-S,--start <arg> Start revision, for incremental (SVN)-t,--type <arg> SCM type (CVS | SVN)--tags <arg> find tags to specified depth--tree <arg> (with --info), display tree to specified depth-u,--users List repository users-v,--version Version string
Example: standard usage.java -jar p4convert.jar --config=myFile.cfg
Example: generate a CVS configuration file.java -jar p4convert.jar --type=CVS --default
Example: report Subversion repository usage.java -jar p4convert.jar --type=SVN --repo=/path/to/repo.dump --info

使用 --default 选项创建默认配置文件。您需要使用 --type (值为SVN或CVS)指定SCM类型。生成的文件(default.cfg)将包含一组基于您的平台的默认配置选项。将 default.cfg 重命名为您自己的配置。要使用配置文件运行转换,请使用指定配置文件的--config标志执行jar。

例如:

java -jar p4convert.jar --config=myFile.cfg

生成一个Subversion转储文件

对于Subversion转换,导入和转换模式都需要一个Subversion dumpfile作为历史数据源。

一个dumpfile可以在几个不同的方式产生,其中两个详细如下:

  • 使用svnadmin命令:

    svnadmin dump local_repo_path > dumpfile.dmp
    

    用Subversion repo的路径替换local_repo_path。不要使用--delta标志选项,因为转换工具无法解析结果。

  • 使用远程转储命令:

    rsvndump url > dumpfile.dmp
    

    用远程Subversion服务器替换url。例如:http://file://svn://。请注意,对于在本地生成转储文件的大型服务器,速度要快得多,因此您还可以考虑在生成转储文件之前使用 svnsync 创建subversion存储库的本地副本。

选择CVS根目录

对于CVS转换,导入和转换模式都需要一个包含RCS文件作为历史数据源的路径。CVSROOT可以根据每个模块进行过滤或导入。转换器将只在指定的CVSROOT路径下导入文件修订。

第2章 配置

java转换需要一个配置文件来设置必要的选项。通过使用--default参数运行转换器并指定CVS或SVN,可以生成一个默认配置文件default.cfg。例如:要生成CVS的默认配置文件,运行:

java -jar p4convert.jar --type=CVS --default

有了default.cfg后,将其复制到yourconfig.cfg,然后根据需要对其进行定制。

核心转换器设置

以下设置出现在配置文件的顶部,并在生成时自动定义。不应该修改核心转换器的设置。

  1. 配置文件架构版本。用于标识较旧的配置格式。

    com.p4convert.core.schema=5.50
    
  2. SCM转换类型。设置SVN或CVS配置选项。

    com.p4convert.core.scmType=SVN
    
  3. 用于标识较旧的配置格式预留给测试框架。必须设置为false才能正常操作。

    p4convert.core.test=false
    
  4. 转换工具的发布版本。

    com.p4convert.core.version=PUBLIC.10690
    

通用性能转换器设置

  1. 将变换模式设置为IMPORT为导入模式,设置为CONVERT为转换模式.

    com.p4convert.p4.mode=IMPORT
    
  2. 导入仓库路径和要创建的仓库,例如//import/...

    com.p4convert.core.depotPath=import
    
  3. 可选的子路径可以指定在仓库下面,例如//import/sub/…(注意,即使不使用路径,路径也必须以斜杠(/)结束)。默认值是/

    com.p4convert.core.subPath=sub/
    

一般Subversion转换器设置

如果配置文件已经使用--type=SVN --default正确生成,Subversion配置选项将显示为使用com.p4convert.svn名称空间的块。

这些设置将只适用于SCM模式设置为SVN:

com.p4convert.core.scmType=SVN
  1. Subversion转储文件的本地路径。

    com.p4convert.svn.dumpFile=/Users/bruno/MyDumpFile.dmp
    

一般CVS转换器设置

如果配置文件已经使用--type=CVS --default正确生成,Subversion配置选项将显示为使用com.p4convert.cvs名称空间的块。

这些设置将只适用于SCM模式设置为CVS:

com.p4convert.core.scmType=CVS
  1. 到CVSROOT文件的本地路径(允许使用更深的路径来限制导入的范围)。

    com.p4convert.cvs.cvsroot=/Users/bruno/CVSROOT/
    
  2. (可选)指定要从CVSROOT中导入的CVS模块。

    com.p4convert.cvs.cvsmodule=projX
    
  3. CVS时间窗口(毫秒)。当RCS文件中没有定义commitid时,转换器将计算哪些修订应该分组到变更列表中。时间窗口指定了转换器应该预先查找匹配修订的最大范围。

    com.p4convert.cvs.timeWindow=20000
    
  4. CVS临时目录。所有CVS资产都被重新格式化为全文文件。指定的临时目录用于在转换期间存储内容。

    com.p4convert.cvs.tmpDir=tmp
    

CVS映射路径

CVS路径使用原始的RCS文件结构映射到Perforce,但是前缀是分支名称。转换器对初始1.1分支使用分支名称“main”,对后续分支使用符号名称。

如果需要,可以提供一个可选的路径映射来将CVS路径重新映射到Perforce中的新结构。在设计路径映射时,必须小心确保所有CVS路径都有一个目标映射。

要启用CVS路径映射,请使用正则表达式和组匹配创建一个名为path.map的文件。
2. 只使用第一个匹配条目。
3. 正则表达式和组匹配通过 ‘,’ (或在正则表达式术语 ‘,\s+’ 中)分离。
4. 以“#”开头的行将被忽略。

例如,‘trunk’被重命名为‘main’,但是其他条目保持原样。

# path.map
trunk/(.*), //import/main/{1}
(.*), //import/{1}

注意:如果没有找到文件,则使用默认的“depot”和“subPath”选项来生成映射,保留原始行为。CVS路径将始终显示“branch”名称。“main”代表1.1,而符号代表其他分支。

# path.map
main/projA/(.*), //import/projA/MAIN/{1}
release_(.*)/projA/(.*), //import/projA/REL{1}/{2}
(.*)/projA/(.*), //import/projA/TAG-{1}/{2}
(.*), //import/unexpected/{1}

Note: 添加catch all是个好主意(如“unexpected”目录的最后一行所示)。

标签CVS路径

CVS将用符号标记修订版本,其中一些符号可能指的是标签,而其他的则是分支名称。如果标签被禁用(默认),那么只有具有历史记录的符号被转换为Perforce分支,其余的符号被忽略。然而,如果标签被启用,那么从分支检测剩下的符号被转换为强制标签。

  1. 要启用CVS符号标记,请将com.p4convert.cvs.labels设置为true

  2. 在多个CVS转换中,如果之前使用过标签,则可能会出现名称空间冲突。默认情况下,转换器将使用CVS符号作为Perforce标签的名称。但是,可以通过设置以下选项来格式化: com.p4convert.cvs.labelFormat。参数{symbol}将被CVS符号名替换。

    例如:

    com.p4convert.cvs.labels=true
    com.p4convert.cvs.labelFormat=import_{symbol}_label
    

    将导入一个名为REL1.0的CVS符号作为强制标签import_REL1.0_label

Subversion:选择性和增量转换

  1. 可以使用配置选项startRevisionendRevision来限制Subversion修订范围。默认情况下,从修订1开始,导入所有修订(通过将endRevision设置为0来定义)。

    com.p4convert.svn.start=1
    com.p4convert.svn.end=0
    
  2. 可以使用导入模式进行增量转换。重要的是,要注意最后一个导入的Subversion版本,并从下一个版本开始进行后续导入。例如:导入前100个subversion版本,设置配置选项为:

    com.p4convert.svn.start=1
    com.p4convert.svn.end=100
    
  3. 在导入开始时,将显示以下摘要:(在本例中,23000中只有前100个修订被导入)。

    Importing Subversion ranges:start: 1end: 100last: 23000
    
  4. 对于下一个增量导入(比如另外100个修订),将修订范围设置为…

    com.p4convert.svn.start=101
    com.p4convert.svn.end=200
    
  5. 可以使用--start--end标志在命令行上覆盖开始和结束修订。例如,只导入Subversion修订201:

    java -jar convert.jar --config=default.cfg --start=201 --end=201
    
  6. 为了覆盖开始和结束修订,您可以使用--repo标志覆盖Subversion转储文件位置。例如,来自增量转储的修订范围:

    svnadmin dump /path/to/repo/ -r 202:300 --incremental > 202-300.dump
    java -jar convert.jar --config=default.cfg --repo=202-300.dump --start=202 --end=300
    

过滤Subversion路径

默认行为是不排除Subversion中的任何路径;但是,对于具有许多tags/文件夹的大型存储库,或者只转换部分Subversion存储库的情况,您可能希望排除某些Subversion路径。可以使用exclude.mapinclude.map两个映射文件进行Subversion路径排除。

过滤基于将Subversion路径匹配到映射文件中的正则表达式。首先处理exclude.map文件,如果模式与部分路径匹配,则跳过该路径。include.map文件可以用来覆盖排除。映射文件重新添加跳过的路径。在开始转换之前,必须根据转储文件对过滤器进行验证(通常这是相当快的,并显示一个进度指示器)。

验证步骤是为了防止分支、复制或合并操作在历史记录的稍后点依赖被排除的路径的情况。如果发现这种情况,将记录路径,并将被排除的源路径添加到issue.map文件中。为了解决这个问题,排除应该从排除中删除。映射文件或正则表达式,基于issue.map文件,添加到include.map文件。

例如:要排除tags/文件夹中的所有Subversion标签,创建一个排除映射文件exclude.map:

# exclude Subversion tags:
^tags/.*

然后启动转换以验证映射:

pallen-mac:main$ java -jar dist/p4convert.jar --config=Config/foo.cfg
loading ChangeMap: changeMap.txt
loading TypeMap: types.map
importing revisions: 1 to 20635 out of 20635
exclude.map: ^tags/.*
Verifying exclusion map...
issue: tags/rel-1.0.14/api
issue: tags/rel-1.0.14/sys
issue: tags/rel-2.0.3
Issues found, saving issue map...
Caught EXIT shutting down ...

看看报告的问题,标签’rel-1.0.14’和’rel-2.0.3’有一些行动与我们的排除冲突,解决这个问题只需添加排除到include.map文件:

# issues reported for tags/ folder
^tags/rel-1.0.14/.*
^tags/rel-2.0.3/.*

标记Subversion路径

当Subversion没有特定的标签实体时,用户可以遵循“标签”约定。如果“标签”路径是纯的(即它没有对内容进行后续更改),那么它可以被转换为强制标签。

  1. 要启用Subversion标签的标记,请将com.p4convert.svn.labels设置为true并定义映射: exclude.mapinclude.map

    com.p4convert.svn.labels=true
    
  2. 地图的设计与分支的切除。默认的行为是所有Subversion标签操作作为Perforce分支导入。为了改变行为并尝试导入Subversion标签作为强制标签,路径必须在排他映射中。例如:要导入文件夹“tags/”中的所有Subversion标签作为Perforce标签,请创建一个排除映射文件exclude.map:

    # exclude Subversion tags:
    ^tags/.*
    
  3. 一个Perforce标签将需要一个从“tags”路径导出的唯一名称空间。转换工具提供了深度和正则表达式配置选项来提供帮助。

    com.p4convert.svn.labelFormat=svn_label:{depth}
    com.p4convert.svn.labelDepth=2
    

    深度决定为唯一标签名称使用多少路径。对于转换Subversion的使用,值通常为“2”。深度为’2’时,'tags’路径的前两个元素将保存在一个数组中,并由正则表达式用于生成标签名称。

    例如,给定一个位于tags/1.0.0/的Subversion标签,下面的正则表达式提供了相应的标签名称:

    com.p4convert.svn.labelFormat=label:{2} label:1.0.0
    com.p4convert.svn.labelFormat={1}-{2} tags-1.0.0
    

    Note:空表达式将使用原始路径。

    com.p4convert.svn.labelFormat= tags/1.0.0/
    

    Note:如果一个关键字{depth}被使用,它将被它的值代替。

    com.p4convert.svn.labelFormat=label_{depth} label_1.0.0
    

变更列表抵消选项

  1. 默认偏移量为0(即不偏移)。偏移量目前可用于转换模式,允许subversion修订通过固定偏移量转换为Perforce changelists:

    com.p4convert.p4.offset=0
    
  2. 转换之后,一个包含Subversion修订号的变更地图文件被追加到本地,以执行变更列表映射。文件名由选项配置:

    com.p4convert.log.changeMap=changeMap.txt
    

    变更地图是这样的:

    # <Change>, <SVN revision>
    1, 1
    2, 2
    3, 3
    ...
    

Unicode支持

以下Unicode enable选项适用于对导入模式和转换模式的Unicode支持。该字符集选项仅适用于导入模式,当翻译文件通过Perforce客户端。在转换模式下,对于启用Unicode的Perforce服务器,归档文件总是用UTF-8编写。

默认值(对于非unicode服务器):

com.p4convert.p4.unicode=false
com.p4convert.p4.translate=true
com.p4convert.p4.charset=<none>

在某些情况下,最好按原样(未翻译)导入文本文件。对于所有用户都在Windows客户机上的非unicode环境,这通常是正确的。若要禁用翻译,请将下列选项设置为false

com.p4convert.p4.translate=false

当翻译被禁用时,high-ascii 文本使用内容类型TEXT-RAW,并且以下警告被禁用:

... Non-unicode server, downgrading file to text

推荐的Unicode转换配置:

com.p4convert.p4.unicode=true
com.p4convert.p4.translate=true
com.p4convert.p4.charset=utf8

对于Unicode转换,请设置JVM参数:

-Dfile.encoding=UTF-8

一些Solaris和Linux转换可能需要设置以下语言环境:

export LC_ALL=en_GB.UTF-8

一旦Perforce服务器切换到Unicode启用模式(-xi),所有客户端工作空间都需要定义一个字符集。

Note:启用非unicode的Perforce服务器将接受UTF16文件。

标准化

生成配置文件时检测到平台Unicode规范化,但是可以通过设置以下配置选项为NFCNFD来更改:

com.p4convert.p4.normalisation=NFD

默认检测基于以下内容:

Platform Normalization
Windows NFC
Mac NFD
*nix/*nux NFC
Sun NFC

Subversion性能

默认情况下,转换器将Subversion属性解析为UTF-8字符串。转换使用诸如 svn:logsvn:author等属性作为Perforce中的属性,并且必须将字节序列解码为UTF-8。在某些数据集中,Windows用户可能在一个或多个代码页中添加了高ASCII字符。这个版本现在支持一个配置选项:

com.p4convert.svn.propTextType=UNKNOWN

下面的字符串表示支持的字符集:

Big5 IBM424_rtl ISO-8859-7 UTF-16LE
BINARY ISO-2022-CN ISO-8859-8 UTF-32BE
EUC-JP ISO-2022-JP ISO-8859-9 UTF-32LE
EUC-KR ISO-2022-KR KOI8-R UTF-8
GB18030 ISO-8859-1 Shift_JIS windows-1251
IBM420_ltr ISO-8859-2 UNKNOWN windows-1252
IBM420_rtl ISO-8859-5 US-ASCII windows-1254
IBM424_ltr ISO-8859-6 UTF-16BE windows-1256

第一次扫描总是UTF-8,然后是配置选项。BINARY意味着跳过,并插入字符串<binary property>

高级配置

目录属性

以下选项允许将Subversion目录属性存储为Perforce中版本化的文件。要启用此模式,请将以下属性设置为true:

com.p4convert.svn.propEnabled=true

选择属性名称和格式:(注意:只支持ini模式):

com.p4convert.svn.propEncoding=ini
com.p4convert.svn.propName=.svn.properties

空的变更列表

以下属性将尝试跳过空更改(其中更改不包含修订)。这通常是客户端或导入模式的默认行为,因此它实际上只在转换模式中使用。

com.p4convert.p4.skipEmpty=false

用户名的翻译

可以使用--users选项生成用户名映射文件(users.map),然后使用新用户名修改--users。只有当转换工具在当前工作目录中找到users.map文件时,才会进行重命名。CVS转换目前不支持用户名映射。

二进制文件检测

可以通过将二进制文件的扩展名添加到类型映射文件types.map来识别它们。该格式基于Perforce typemap规范,但是它被限制为//....ext形式的路径(其中.ext是二进制扩展)。

默认类型映射(types.map):

TypeMap:binary //....zipbinary //....gifbinary //....pngbinary //....jpgbinary //....dllbinary //....classbinary //....jarbinary //....ecsfr

支持修改位(+mxwlk),可以使用类型映射添加。推荐使用类型映射进行二进制检测,因为转换要快得多。ICU4J 库将扫描类型映射中没有标识的二进制文件,如果没有找到text/Unicode匹配,则假定它们是二进制文件。

Warning: 在Windows客户机上,ICU4J可能会错误地将小二进制文件识别为创建文本同步问题。

变更列表描述格式

logRevID选项可用于重新格式化Subversion修订描述,以包含修订ID使用模板:

  • <rev>用Subversion版本替代
  • 用Subversion日志替换了<description>

默认值(原样):

com.p4convert.p4.logRevID=<description>

区分大小写

在生成配置文件时检测到平台的大小写敏感性。通常没有理由从检测到的默认值更改此行为。应该避免在不同平台之间进行转换,特别是在从区分大小写的环境(如Linux)转换到区分大小写的环境(如Windows)时。支持的高级案例处理选项是使用以下选项之一设置的:

com.p4convert.p4.caseMode=FIRST
  • NONE - 将所有路径视为区分大小写(Linux)。
  • LOWER - 将所有路径转换为小写
  • UPPER - 将所有路径转换为大写
  • FIRST - 使用第一个遇到的用例组合(Windows)

当使用转换模式时,生成的Perforce archive文件是基于平台的大小写敏感性。但是在Linux平台上,存储归档文件就像在不区分大小写的服务器(p4d -C1)上一样有用。这可以通过设置以下选项为true来模拟:

com.p4convert.p4.lowerCase=true

Important: 如果设置了此选项,则必须将由com.p4convert.adv.p4root定义的Perforce根目录的路径设置为小写,并且必须使用大小写模式’FIRST’。

RCS关键字扩展(svn: keywords)

默认情况下,RCS关键字扩展属性被导入;但是设置配置选项:

com.p4convert.svn.keepKeyword=true

设置false值将忽略所有以前的关键字属性,并将文件作为普通文本导入。

合并信息(svn: mergeinfo)

支持Subversion 1.5-1.7合并信息,并为各种操作计算相应的执行集成积分。该功能在默认情况下是不启用的,如果需要,以下配置选项必须设置为真:

com.p4convert.svn.mergeInfoEnabled=true

第3章 运行P4Convert

导入模式

导入模式将从Subversion转储文件或CVS存储库中拉入文件修订,并将它们添加到由配置选项中的连接细节指定的Perforce服务器中。要使用此模式设置:

com.p4convert.p4.mode=IMPORT

在向已有的性能服务器添加数据时,应注意修订操作不会与性能服务器中已经存在的修订冲突;通常,如果服务器自上次迁移以来一直在使用,就会发生这种情况。

为了避免这种情况,导入应该是唯一的存储库(以避免冲突),或者只能在后续迁移期间读取Perforce服务器。转换完成后,可以使用PerfMerge++之类的工具将新数据与现有的存储库合并。

转换器将检查您的Perforce服务器没有挂起的更改,并将中止转换,如果有任何检测。

特定于导入模式的用户指南配置选项。

  1. 服务器地址和端口(用'\:'转义':')

    com.p4convert.p4.port=localhost\:4444
    
  2. 服务器连接的默认用户和客户端:

    com.p4convert.p4.client=p4-client
    com.p4convert.p4.user=p4-user
    
  3. 客户端工作区根用于导入文件到Perforce:

    com.p4convert.p4.clientRoot=/Users/bruno/ws/
    
  4. 如果安全级别设置为1级或更高,那么p4-user必须在保护表中具有管理权限,密码必须以字符串形式提供(默认设置为本地目录下的ws/):

    com.p4convert.p4.passwd=PaSSwoRd
    
  5. 或者,如果用户已经登录并且有一个有效的票证,那么让密码字段未设置,并为P4TICKETS设置您的环境(不要依赖P4TICKETS未设置的默认值,因为p4-java将找不到您的票证文件)。

Warning: 对于需要身份验证的长时间运行的转换,请确保转换用户有“无限”登录超时。

转换模式

转换模式是更先进的,并要求的知识的Perforce日志重播和存档文件存储。此模式只能用于单镜头转换,不能递增使用。转换模式的性能明显优于导入模式(有时是x100 !)

在使用转换模式后,管理员将需要运行多个命令来重建Perforce服务器和升级元数据。

要使用此模式设置:

com.p4convert.p4.mode=CONVERT

特定于转换模式的配置选项

  1. 服务器根地址(路径应该以斜杠(/)结尾),默认设置为p4_root/在你的本地目录下:

    com.p4convert.p4.root=/full/path/to/p4_root/
    
  2. 更改开始转换的列表偏移量(方便批处理转换):

    com.p4convert.p4.offset=0
    
  3. 生成的日志名称(在运行批处理转换时增加前缀很有用):

    com.p4convert.p4.jnlIndex=0
    com.p4convert.p4.jnlPrefix=jnl.
    
  4. 模拟2011.1或更高级别的信用行为在回滚/降级(使设定值为true):

    com.p4convert.p4.downgrade=false
    
  5. 在服务器上存储文件时,Perforce规范行结束符,并基于客户端工作区选项和平台类型恢复它们。但是,在特殊情况下,在服务器中存储lineend并在客户端中使用“share”选项是很有用的。若要禁用正常的行结束支持,请将以下选项设置为false:

    com.p4convert.p4.lineEnding=true
    
  6. 对于非Unicode服务器,或简化存储高ascii文件,设置以下选项为false将存储为二进制文件:

    com.p4convert.p4.unicode=false
    

转换后[转换模式]

要完成转换模式转换,您将需要安装p4和p4d,并运行一些强制命令。

  1. [需要]将目录改为P4ROOT,检查没有db.*文件,然后重播日志文件:

    $ cd p4_root
    $ p4d -r . -jr jnl.0
    Perforce db files in '.' will be created if missing...
    Recovering from jnl.0...
    Perforce server info:Server version 33 is replaying a version 0 journal/checkpoint.
    

    Note: 服务器版本设置为0以提醒管理员需要升级,请参见步骤3。

  2. 或者,对于多个日志文件:

    $ p4d -r . -jr jnl.0 jnl.1 ....
    

    接着使用 nohup:

    nohup p4d -r . -jr jnl.0 jnl.1 .... &
    
  3. [需要]从2004.2模式升级数据库。为简单起见,转换使用旧模式生成数据库,允许您升级到自己选择的Perforce服务器版本。从P4ROOT目录运行upgrade命令:

    $ p4d -r . -xu
    Perforce db files in '.' will be created if missing...
    2001.1: splitting db.integ into db.integed/db.resolve.
    2001.1: splitting db.have into db.have and db.label.
    2002.1: splitting pending db.change into db.changex.
    2002.2: upgrading tempobj filetype in db.rev.
    2002.2: upgrading tempobj filetype in db.working.
    2003.1: initialize default depot.
    2003.2: upgrading db.user.
    2005.1: building db.revhx (headrev) table.
    2005.1: building db.locks from db.working.
    2005.2: building db.revdx (delrev) table.
    2005.2: moving spec depot entries into db.revsx.
    2007.3: (re)building haveMap from db.have/db.working.
    2007.3: (re)building db.archmap (lazy-copy map) table.
    2007.3: removing old db.archive.
    2008.1: upgrading db.change.
    2009.2: moving db.boddate/db.ixdate into db.bodtext/db.ixtext.
    2009.2: removing db.boddate/db.ixdate.
    2010.2: adding db.config.
    2011.1: upgrading tiny.db.
    ...upgrades done
    
  4. [可选]如果转换是在Unicode模式下运行的(其中com.p4convert.p4.unicode=true)),用户将继续添加Unicode内容,那么您可能希望将服务器设置为Unicode模式。要启用Unicode,请从P4ROOT目录运行以下命令:

    $ p4d -r . -xi
    
  5. [替代方案]如果你在Linux上运行你的Perforce服务器,而你的用户主要是Windows,你可能希望强制服务器运行作为大小写不敏感(只允许一个版本的路径和文件的case)。转换选项com.p4convert.adv.lowerCase=true将与case模式设置为com.p4convert.adv.caseMode=FIRST一起使用。所有p4d命令都必须包含-C1标志,这包括前面的步骤1和步骤2。

    例如:

    $ cd p4_root
    $ p4d -C1 -r . -jr jnl.0
    $ p4d -C1 -r . -xu
    
  6. [推荐]一些归档文件可能没有MD5 sum摘要(通常情况下,Subversion没有存储摘要,或者由于使用关键字扩展,摘要不匹配)。要填写MD5 sum摘要和归档文件大小的元数据,请使用verify命令(对于大型服务器,这可能是最好的拆分成仓库和子目录):

    $ p4 verify -u //...
    

第4章 笔记

关键字扩展问题

转换过程保持关键字文件类型,并设置这些文件在Perforce与+k修饰符。但是Subversion和Perforce中的关键词有不同的扩展方式。例如:在Subversion中关键字RevisionRevisionRevision扩展为:

$Revision: 25005 $ (a change number in Perforce)

另一个例子是关键字DateDateDate,它在Subversion中也提供了时间…

$Date: 2006-02-17 12:09:10 +0000 (Fri, 17 Feb 2006) $

而在Perforce……

$Date: 2006/02/17 $

以下是一些备选方案(基于上面的例子):

$Revision$ ==> $Change$ gives $Change: 25005 $
$Date$ ==> $DateTime$ gives $DateTime: 2006/02/17 12:09:10 $

由于关键字扩展的不同,MD5总和在Subversion中是无效的使用。

这就是为什么任何关键字扩展文件都有一个空的MD5和,为什么p4 verify -u //...命令被推荐在“可选步骤”部分。

验证

验证可以使用运行的Subversion服务器执行,并使用审计日志比较文件中的差异。若要启用审计日志,请将以下选项设置为true并选择文件名。

com.p4convert.log.audit.enabled=true
com.p4convert.log.audit.filename=audit.log

审计日志的示例行:

# <SVN path>, <SVN revision>, <P4 change>, <MD5 sum>
trunk/src/foo.c, 1, 1, 1234567890abcdef1234567890abcdef

输出和日志

控制台输出和日志配置选项

可以用另一个配置文件覆盖默认的SLF4J日志记录选项;使用本地文件指定log4j.configuration选项,使用语法:

file:your_local_file

java -Dlog4j.configuration=file:debug.log4j.properties -jar p4convert.jar

这些选项是为测试或未来的增强保留的:

com.p4convert.core.test
com.p4convert.core.version
com.p4convert.svn.emptyDirEnabled
com.p4convert.svn.emptyDirName

阅读控制台/日志输出

Importing Subversion ranges:
start: 1
end: 23091
last: 230911.0 A:D - trunk
1.1 A:D - trunk/src
1.2 A:F - trunk/src/foo.c (UTF-8)
mapping: r1 => @12.0 A:F - trunk/src/bar.png (BINARY)
mapping: r2 => @2
...

输出行说明,如:

1.2 A:F - trunk/src/foo.c (UTF-8)

编号1.2指的是当前的Subversion修订和节点操作。(1代表Subversion修订1,.2 = 第三个节点动作.0将是第一个索引)

字母A:F表示Subversion操作,如果是文件或目录操作。

  • A Add
  • B Branch
  • E Edit
  • I Integrate (merge fromNode)
  • M Merge (svn:mergeinfo)
  • C Copy (svn replace action with fromNode)
  • U Update (svn replace action)
  • R Remove (delete)
  • F File
  • D Directory

subversion路径trunk/src/foo.c后面是检测到的类型。

Detected Type Perforce Base Type
UTF-8 Unicode
UTF-16BE utf16
UTF-16LE utf16
UTF-32BE Unicode
UTF-32LE Unicode
Shift_JIS Unicode
ISO-2022-JP downgraded to binary
ISO-2022-CN downgraded to binary
ISO-2022-KR downgraded to binary
GB18030 Unicode
EUC-JP Unicode
EUC-KR Unicode
Big5 Unicode
ISO-8859-1 Unicode
ISO-8859-2 Unicode
ISO-8859-5 Unicode
ISO-8859-6 downgraded to binary
ISO-8859-7 Unicode
ISO-8859-8 Unicode
windows-1251 Unicode
windows-1254 Unicode
windows-1256 downgraded to binary
KOI8-R Unicode
ISO-8859-9 Unicode
IBM424_rtl downgraded to binary
IBM424_ltr downgraded to binary
IBM420_rtl downgraded to binary
IBM420_ltr downgraded to binary
BINARY binary

Note: 检测到的类型基于使用ICU4J的语言检测,而不是Subversion MIME或性能检测。

最后mapping:r223 => @223引用Subversion修订号(r223)到Perforce变更列表号(@223)。通常为1:1,除非与活动的或已存在的性能服务器进行偏移或合并。

错误

在导入模式下,Perforce相关的p4-java消息被报告为警告,需要进行验证,例如:

46.3 A:F - repo/trunk/my.file
WARNING: p4java: //import/repo/trunk/my.file - file(s) up-to-date.

在转换模式下,错误被报告为Panics,并抛出异常。

有问题的Subversion转储记录可以提取和发送到Perforce时,它不可能发送在整个dumpfile。提取的dumpfile只包含元数据,文件内容被删除并替换为块计数。

在异常期间,请注意Subversion修订和节点ID(上面的示例的修订号为46,节点号为3)。然后运行以下命令提取有问题的记录,例如:

$ java -jar dist/p4convert.jar --type=SVN --repo=mysvndump.dump --extract=46.3
searching for node: 46.3...
Node-path: repo/trunk/my.file
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 308
Text-content-md5: 6a339b6ccf2af72d77169ef29b98eb0b
Content-length: 318PROPS-END

然后生成一个名为node.46.3的文件。dump和will包含要发送到Perforces的Subversion记录,以及Subversion元数据(搜索node: 46.3之后的所有内容)。

将SVN迁移至Perforce的工具 p4convert 指南相关推荐

  1. svn 提交到远程仓库_聊聊如何从SVN迁移源码到Git仓库

    背景介绍 这里就不再赘述关于SVN与Git的区别以及为什么要迁移源码到Git了,毕竟Git是当前的主流DVCS了,而且已经公认地非常好用,如果你还在使用SVN的话该考虑换了,是时候迁移那些遗留代码了, ...

  2. 项目如何从 SVN 迁移到 Git

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 版本管理 SVN版本管理:场景命令实战 SVN版本管理:两种开发模式 GIT版本管理:场景命令实战 GIT版本管理: ...

  3. 从SVN迁移到Git(包括SVN历史纪录)【最系统的讲解】

    从SVN迁移到git有很多方法,最简单的就是使用git包自带的git svn命令(git v1.7及以上).除此之外还有一些第三方的专门的转换工具如http://www.subgit.com/,htt ...

  4. svn迁移到git_SVN到GIT的迁移完整教程

    svn迁移到git I have worked with SVN for a long time and recently I have started working on Git. After g ...

  5. Gitea:从SVN迁移到Git

    目录 环境信息 迁移步骤 SVN和Git都是优秀的版本管理工具.不幸的是,对于从SVN迁移到Git的过程.命令和说明,网上不少文章存在误导性.因此本文以Gitea为例,演示从SVN迁移到Git的详细过 ...

  6. SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展,GIT逐渐取代SVN成为主流的版本管理工具,部门的项目代码也决定迁移至git进行 ...

  7. mysql 客户无感知迁移_亿级账户数据迁移,不用数据库工具还能怎么搞?

    原标题:亿级账户数据迁移,不用数据库工具还能怎么搞? 背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建 ...

  8. SVN迁移到Git的过程(+ 一些技巧)

    SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...

  9. HDFS数据迁移解决方案之DistCp工具的巧妙使用

    HDFS数据迁移解决方案之DistCp工具的巧妙使用 参考文章: (1)HDFS数据迁移解决方案之DistCp工具的巧妙使用 (2)https://www.cnblogs.com/felixzh/p/ ...

最新文章

  1. js实现响应式瀑布流
  2. java日志统一集成的两种方案
  3. 前后端分离项目_七个开源的 Spring Boot 前后端分离项目,一定要收藏
  4. 趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口
  5. django3,vue前后端分离数据请求
  6. 8.1并发集合(Concurrent Collections)
  7. 数据挖掘概念与技术第三版 范明、孟晓峰译 第三章习题答案
  8. Neo4j Desktop 添加算法插件Graph Algorithms
  9. ibm17个量子纠缠计算机,走近量子纠缠-17-量子计算机
  10. 0x77A26B83 (ntdll.dll) 处有未经处理的异常: 0xC0000374: 堆已损坏。
  11. 【STM32L552ZET6QU】小白入门资料汇总
  12. Android驱动——WiFi驱动移植
  13. Java计算两个时间点的工作日
  14. ibm服务器显示0 bf,IBM服务器常见服务器故障总结
  15. 公司产品移动端网页-前端网页设计技术精美网站源码HTML+CSS+JS
  16. 机器学习——EM和GMM(基于李航老师的推导)
  17. 电力系统| IEEE论文投稿流程
  18. 带你Java基础入门
  19. 毕设-基于JavaWeb毕业论文选题系统
  20. android手机屏AMOLED如何驱动?

热门文章

  1. odoo登录后显示空白页
  2. Docker学习,Docker常见命令
  3. 4.使用Office Open XML SDK访问Excel2007数据表
  4. 青龙面板JD稳定更新库
  5. excel的自动生成目录
  6. 从开发者的角度分析iOS应如何省电
  7. AE常见问题合集,适合初学者
  8. mac用python爬虫下载图片_使用Python爬虫实现自动下载图片
  9. 大数据分析题-考试竞赛(分享)
  10. 用手势遥控电脑wiimote