我正在使用cvs2svn转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。cvs2svn包含单个分支和头部?
在我的新转换中,我只想转换HEAD和一个分支。 cvs2svn只对分支有“排除”功能,但不包含“包含”。我有许多分支机构,不包括每一个,他们每一个将采取很多工作....
是否有任何方式转换只有树干(HEAD),只有一个分支?
感谢, 俄德
我正在使用cvs2svn转换我的存储库。我已经在一个存储库中成功完成了,现在我的新问题是第二个存储库。cvs2svn包含单个分支和头部?
在我的新转换中,我只想转换HEAD和一个分支。 cvs2svn只对分支有“排除”功能,但不包含“包含”。我有许多分支机构,不包括每一个,他们每一个将采取很多工作....
是否有任何方式转换只有树干(HEAD),只有一个分支?
感谢, 俄德
如果你只是想保留一个分支和无标签,那么这很容易。一个符号相匹配的第一条规则被使用,因此指定要被列入然后在该分支排除一切:
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: ...
一个问题是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`
我不认为这是工作的很多...
我看到某处写--froce支= NAME = - 排除的选项* 什么你认为? – Oded 2009-08-25 07:13:40
我不认为它会起作用。如果我正确地读取了代码,它们从左到右进行评估,因此首先包含分支,然后排除。不过,它可能会按照相反的顺序传递选项。 – 2009-08-25 07:24:01
你提到的关于--force-branch的选项不起作用。但是,符号信息的第二个选项非常完美! 谢谢! – Oded 2009-08-27 07:25:22