我正在使用 cvs2svn 来转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。
在我的新转换中,我只想转换 HEAD 和一个分支。cvs2svn 只对分支有“排除”功能,但没有“包含”功能。我有很多分支,排除每一个分支都需要大量的工作....
有没有办法只转换主干(HEAD)和一个分支?
谢谢,奥德
我正在使用 cvs2svn 来转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。
在我的新转换中,我只想转换 HEAD 和一个分支。cvs2svn 只对分支有“排除”功能,但没有“包含”功能。我有很多分支,排除每一个分支都需要大量的工作....
有没有办法只转换主干(HEAD)和一个分支?
谢谢,奥德
一个问题是 cvs2svn 不仅需要确定是否包含分支,而且(同时)首先需要确定符号是分支还是标记。所以如果你想包含那个分支,还有一些标签,这比仅仅说“只包含那个分支”更困难——这样做会杀死所有标签。
IOW,cvs2svn 并不真正支持这一点。您可以通过编辑其源代码来解决。在 cvs2svn_lib.symbol_strategy.BranchIfCommits 中,将返回 Branch(symbol) 的大小写更改为
if symbol.name == 'my_branch':
return Branch(symbol)
else:
return ExcludedSymbol(symbol)
IIUC,BranchIfCommits 应该默认使用。
就个人而言,我会使用不同的策略:
1. convert the repository once, with all branches.
2. do a "svn ls" on branches, and redirect that into a file.
3. edit the file to construct an exclude regex out of it, of the form `b1|b2|...|bn`
我不会说这是很多工作......
如果您只想保留一个分支而没有标签,那么这很容易。使用与符号匹配的第一条规则,因此指定要包含的分支,然后排除其他所有内容:
cvs2svn --force-branch=mybranch --exclude='.*' ...
如果您不仅要包含分支,还要包含尽可能多的标签,那就有点棘手了。您不仅不一定知道所有标签的名称,而且您也不能包含依赖于排除分支的标签。在这种情况下,使用 --write-symbol-info 和 --symbol-hints 选项最容易:
cvs2svn --write-symbol-info=symbol-info.out --passes=1:3 ...
这将创建一个名为“symbol-info.out”的文件,其中包含有关所有 CVS 符号的信息。在您的编辑器中,打开此文件,找到与您要排除的分支相对应的所有行,并将这些行的第三列更改为“排除”一词。确保要包含的分支的行的第三列包含单词“branch”,并且它的第四列是您希望它结束的路径。
现在再次运行 cvs2svn,从第 3 步开始,使用编辑的符号信息文件作为符号提示文件:
cvs2svn --symbol-hints=symbol-info.out --passes=3 ...
你会得到很多错误,比如:
ERROR: ExcludedSymbol('FOO_BRANCH') cannot be excluded because the following symbols depend on it:
BAR_TAG
BAZ_TAG
现在回到编辑器并更改列出的标签(示例中的 BAR_TAG 和 BAZ_TAG)也被排除,然后再次尝试运行 pass3。这个过程可能需要迭代几次,但应该不会很麻烦,因为 pass3 运行得非常快。
当您完成 pass3 且没有错误时,运行其余的转换:
cvs2svn --symbol-hints=symbol-info.out --passes=4: ...