2009-08-25 55 views
2

我正在使用cvs2svn转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。cvs2svn包含单个分支和头部?

在我的新转换中,我只想转换HEAD和一个分支。 cvs2svn只对分支有“排除”功能,但不包含“包含”。我有许多分支机构,不包括每一个,他们每一个将采取很多工作....

是否有任何方式转换只有树干(HEAD),只有一个分支?

感谢, 俄德

回答

1

如果你只是想保留一个分支和无标签,那么这很容易。一个符号相匹配的第一条规则被使用,因此指定要被列入然后在该分支排除一切:

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

如果你想不仅包括分支,而且许多标记为可能的,那么这是有点棘手。您不但不一定知道所有标签的名称,还不能包含依赖排除分支的标签。在这种情况下,它是最容易与--write符号,信息和--symbol-提示选项的工作:

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

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

现在再次运行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: ... 
+0

你提到的关于--force-branch的选项不起作用。但是,符号信息的第二个选项非常完美! 谢谢! – Oded 2009-08-27 07:25:22

1

一个问题是cvs2svn不仅需要确定是否包括分支或没有,但(同时)一个符号是否是分支或摆在首位的标签。所以如果你想要包含一个分支和一些标签,那么比仅仅包含“那个分支”更难 - 这样做会杀死所有标签。

IOW,cvs2svn并不真的支持这一点。您可以通过编辑其源代码来解决问题。在cvs2svn_lib.symbol_strategy.BranchIfCommits,在那里它返回科(符号)来

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` 

我不认为这是工作的很多...

+0

我看到某处写--froce支= NAME = - 排除的选项* 什么你认为? – Oded 2009-08-25 07:13:40

+0

我不认为它会起作用。如果我正确地读取了代码,它们从左到右进行评估,因此首先包含分支,然后排除。不过,它可能会按照相反的顺序传递选项。 – 2009-08-25 07:24:01