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

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

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

谢谢,oded

有帮助吗?

解决方案

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

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

其他提示

的一个问题是cvs2svn不仅需要,以确定是否包括分支或没有,但(同时)一个符号是否是分支或在第一位置的标记。所以,如果你想包括一个分支,也有一些标签,它的难度要比只是说“只包括分支” - 这样做会杀死所有的标签

督察,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`

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top