【问题标题】:cvs2svn include single branch and head?cvs2svn 包括单个分支和头部?
【发布时间】:2009-08-25 06:32:10
【问题描述】:

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

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

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

谢谢, 奥德

【问题讨论】:

    标签: repository branch cvs2svn


    【解决方案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 符号的信息。在您的编辑器中,打开此文件,找到与您要排除的分支相对应的所有行,然后将这些行的第三列更改为“排除”一词。确保要包含的分支所在行的第三列包含单词“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: ...
    

    【讨论】:

    • 您提到的关于 --force-branch 的选项不起作用。但是,带有符号信息的第二个选项可以完美运行!谢谢!
    【解决方案2】:

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

    我不会说这是很多工作......

    【讨论】:

    • 我在某处看到了写 --froce-branch=NAME --exclude=.* 你觉得怎么样?
    • 我认为它不会起作用。如果我正确阅读了代码,它们会从左到右进行评估,因此首先包含分支,然后排除。不过,以相反的顺序传递选项可能会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2011-08-01
    • 2011-07-21
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多