1

我正在尝试列出从父 SVN 分支创建的所有分支,以在 Subversion 中建立分支的图形表示。
是否有任何可用于实现此目的的 SVN 命令?
或者有没有办法解决这个问题?

示例:

父分支:Branch1
子分支:Branch2 和 Branch3(两个分支都是从 Branch1 创建的)。
GrandChildren 分支:Branch2.1、Branch3.1 等,
给定Branch1,我试图分别列出从父分支(Branch1)和子分支创建的子分支和子分支。

结果:

Branch1-------Branch2--------Branch2.1,Branch 2.2 ..
|__________________Branch3-------Branch3.1,Branch3 .2...


4

1 回答 1

1

我有一个类似的问题要解决。但是,我将搜索范围限制在孩子们身上。制作递归脚本会让你找到孙子。

因为我必须检查的存储库有很多分支和提交,svn log所以命令可能非常慢。因此,我将工作分为两个步骤:

  1. 检索创建子分支的提交日志。我将它们保存在一个文件中,一行:

    parent='/branches/2014/new-components'
    svn log  https://svn.abc.org/branches/ -r1903:HEAD -v | ack -C2 "A.+\(from ${parent}:[0-9]+" >> kids.log
    

    -r1903 是限制搜索以尝试加快速度。我知道父分支是在 r1903 创建的,所以无需查看。

    我用过ack,但grep工作方式相同。

  2. 我写了一个 python 2.7 脚本来解析kids.log文件:

    from __future__ import print_function
    
    import re
    import subprocess
    
    parser = argparse.ArgumentParser()
    parser.add_argument("file", help="svn log file to parse")
    args = parser.parse_args()
    
    parent='/branches/2014/new-components'
    
    # Regexp to match the svn log command output
    #    1st match = revision number
    #    2nd match = author
    #    3rd match = date of creation
    #    4th match = branch path
    #    5th match = 1st line of commit message
    
    my_regexp = re.compile(r'r([0-9]+) \| (.+) \| ....-..-.. ..:..:.. \+.... \((.+)\) \| [0-9]+ lines?\n'
                           'Changed paths:\n'
                           ' *A (.+) \(from '+parent+':[0-9]+\)\n'
                           '\n'
                           '(.+)\n')
    
    with open(args.file, 'r') as f:
        matches = my_regexp.finditer(f.read())
    
    # print kids name
    bnames =  [m.group(4) for m in matches]
    print('\n'.join(bnames))
    

    提示:我将最后两行替换为以下内容以收集所有匹配项:

    allinfo = [[m.group(i) for i in range(1,6)] for m in matches]
    

    然后您可以循环allinfo并根据需要打印出您需要的信息。

大孩子:要制作递归脚本,必须将第 1 步和第 2 步转换为一个 python 脚本中的函数。第 2 步将调用第 1 步,并将找到的孩子姓名作为参数。对象可能有助于跟踪整个家谱。

于 2017-11-29T16:14:23.367 回答