cvs2svn包括单分支和头部?

时间:2009-08-25 06:32:11

标签: repository branch cvs2svn

我正在使用cvs2svn来转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。

在我的新转换中,我想只转换HEAD和一个分支。 cvs2svn只对分支有“排除”功能,但不包含“包含”。我有很多分支,不包括每一个分支,每个分支都需要很多工作....

有没有办法只转换主干(HEAD)和只有一个分支?

感谢, 乌迪德

2 个答案:

答案 0 :(得分:1)

一个问题是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`

我不会称之为很多工作......

答案 1 :(得分:1)

如果您只想保留一个分支而没有标记,那么这很容易。使用与符号匹配的第一个规则,因此请指定要包含的分支,然后排除其他所有内容:

cvs2svn --force-branch=mybranch --exclude='.*' ...

如果您不仅要包括分支,还要包含尽可能多的标记,那么它有点棘手。您不仅不必知道所有标记的名称,而且还不能包含依赖于排除分支的标记。在这种情况下,最简单的方法是使用--write-symbol-info和--symbol-hints选项:

cvs2svn --write-symbol-info=symbol-info.out --passes=1:3 ...

这将创建一个名为“symbol-info.out”的文件,其中包含有关所有CVS符号的信息。在编辑器中,打开此文件,找到与要排除的分支对应的所有行,并将这些行的第三列更改为单词“exclude”。确保要包含的分支行的第三列包含单词“branch”,其第四列是您希望它结束​​的路径。

现在再次运行cvs2svn,从第3遍开始,并使用编辑过的symbol-info文件作为符号提示文件:

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: ...