我正在尝试列出从父SVN分支创建的所有分支,以在Subversion中建立分支的图形表示。
是否有可用于实现此目的的SVN命令?
或者有解决方法吗?
示例:
家长分行:Branch1
子分支:Branch2和Branch3(从Branch1创建的两个分支)
GrandChildren分行:Branch2.1,Branch3.1等,
鉴于 Branch1 ,我正在尝试列出分别从Parent Branch(Branch1)和Child Branches创建的子分支和Grand Children分支。
结果:
Branch1 ------------------- Branch2 ------- Branch2.1,Branch 2.2 ..
| __________________ Branch3 ------- Branch3.1,Branch3.2 ...
答案 0 :(得分:1)
我遇到了类似的问题需要解决。但是我限制了我对孩子们的搜索。制作一个递归脚本可以让你找到大孩子。
因为我必须检查的存储库有很多分支和提交,svn log
命令可能非常慢。所以,我分两步完成了工作:
检索创建Children分支的提交日志。我把它们保存在一个文件中,只有一行:
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
的工作方式相同。
我写了一个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
并根据需要打印出你需要的信息。
Grand kids:要制作递归脚本,必须在一个python脚本中将步骤1和2转换为函数。第2步将调用步骤1,并将找到的孩子名称作为参数。对象可以帮助跟踪整个家谱。