【问题标题】:How do I identify what branches exist in CVS?如何识别 CVS 中存在哪些分支?
【发布时间】:2010-10-08 15:24:42
【问题描述】:

我有一个旧的 CVS 存储库,应该迁移到 Perforce。

对于每个模块,我需要确定该模块中存在哪些分支。

我只想要一个分支名称列表,没有标签。 出于脚本原因,它必须是命令行工具。

例如(假设有一个 cvs-list-branches.sh 脚本):

$ ./cvs-list-branches.sh module1
HEAD
dev_foobar
Release_1_2
Release_1_3
$

【问题讨论】:

    标签: command-line scripting cvs branch


    【解决方案1】:

    作为一个快速破解:) rlog 也是如此。

    cvs log -h | awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}' | sort -u
    

    根据bdevay的改进版本,隐藏不相关的输出并左对齐结果:

    cvs log -h 2>&1 | awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}' | awk '{print $1}' | sort -u
    

    【讨论】:

    • 小美化:cvs log -h 2>&1 | awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}' | awk '{print $1}' | sort -u 它还隐藏了以“cvs log:”开头的行并将结果向左对齐。
    • 使用 2>&1 和隐藏不相关数据的好方法
    • 有人能详细说明他的实际做什么吗?我的意思是,它在cvs log -h 的输出中寻找什么?至少对我来说这并不明显。
    【解决方案2】:

    您可以简单地解析cvs log -h 的日志输出。对于每个文件,都会有一个名为 Symbolic names : 的部分。那里列出的所有标签的修订号都包含零作为最后一位但一位数字是分支。例如:

    $ cvs log -h
    
    Rcs file : '/cvsroot/Module/File.pas,v'
    Working file : 'File.pas'
    Head revision : 1.1
    Branch revision : 
    Locks : strict
    Access :
    Symbolic names :
        1.1 : 'Release-1-0'
        1.1.2.4 : 'Release-1-1'
        1.1.0.2 : 'Maintenance-BRANCH'
    Keyword substitution : 'kv'
    Total revisions : 5
    Selected revisions : 0
    Description :
    
    ===============================================
    

    在此示例中,Maintenance-BRANCH 显然是一个分支,因为它的修订号被列为 1.1.0.2。这有时也称为 magic 分支修订号。

    【讨论】:

    • 您好,如果没有这样的分支,其分支修订号为魔法分支,这是什么意思?
    • 如果您有很多文件,cvs log -h 会提供大量输出。要调低它,请使用cvs log pom.xml 或类似的东西来获取一个文件的日志。 (这适用于所有情况,对吧?)
    • @LimitedAtonement :是的,确实如此。当我写“解析输出”时,我假设有人会编写某种脚本来预处理输出,然后再用肉眼消费它......;)
    • 我在该输出中看到了Branch revision :。在寻找分支时,这似乎没有任何作用,这有点令人困惑。有人可以解释一下那个条目的用途吗?
    • @sschuberth :如果我没记错的话(我现在已经有一段时间没有积极使用 CVS,而且我不再有一个实时实例可以快速检查)该行将指示当前签出的分支修订(如果有的话 - 在我的示例中显然没有,即文件当前已在 TRUNK 上签出)
    【解决方案3】:

    这也会调出标签,但标签和分支在CVS中基本相同。

    $cvs.exe rlog -h -l -b module1
    

    【讨论】:

    • 有没有简单的过滤标签的方法?我们的 CI 服务器每晚都会产生大量的标签……还是说 CVS 真的那么愚蠢,以至于无法区分分支和标签?
    • 除了解析版本号,没有没有办法告诉。您必须记住,分支是 CVS 添加到 RCS 中的东西,是真正的版本控制。
    • 那么,如何解析版本号以便过滤掉标签并只保留分支?
    • @sschuberth 我已经有 10 多年没有使用 CVS 了,所以我想如果您想得到答案,我建议您将其作为正确的问题提出。
    • 没关系,我已经found the information。有两个主要规则:“分支编号由奇数个点分隔小数组成”和“CVS 有时会在第二个最右边的位置插入一个额外的 0”。
    【解决方案4】:

    我有一小部分“方便”的 korn shell 函数,其中一个函数可以获取给定文件的标签。我做了一个快速的尝试来调整它来做你想做的事。它只是对 (r) 日志输出进行一些 seding/greping 并列出具有“.0”的版本。在它们中(这表明它是一个分支标签):

    get_branch_tags()
    {
        typeset FILE_PATH=$1
    
        TEMP_TAGS_INFO=/tmp/cvsinfo$$
    
        /usr/local/bin/cvs rlog $FILE_PATH 1>${TEMP_TAGS_INFO} 2>/dev/null
    
        TEMPTAGS=`sed -n '/symbolic names:/,/keyword substitution:/p' ${TEMP_TAGS_INFO} | grep "\.0\." | cut -d: -f1 | awk '{print $1}'`
        TAGS=`echo $TEMPTAGS | tr ' ' '/'`
        echo ${TAGS:-NONE}
        rm -Rf $TEMP_TAGS_INFO 2>/dev/null 1>&2
    }
    

    【讨论】:

      【解决方案5】:

      使用 Wincvs(Windows 的 GUI 客户端)这很简单,右键单击将为您提供文件所具有的任何分支和标签。

      通过 shell,您可以使用 cvs log -h -l 模块。

      【讨论】:

      • 就在那里! A 刚刚添加了 wincvs 信息,以便对其他人有用。
      【解决方案6】:

      检查在存储库中创建并提交的第一个文件。在服务器中打开文件,该文件将列出所有标签和分支

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        相关资源
        最近更新 更多