2011-12-22 99 views
1

几个星期前,我将Subversion版本库转换为git,认为一切都很好,然后切换到专门用git工作。但是,现在我注意到我在转换标签和分支时犯了一个错误。在git中重新创建svn标签

SVN回购有一个标签层次结构。所以,举例来说,我们有类似的东西:

branches 
    project1 
    1.0 
    1.1 
    project2 
    1.0.0.1 

等我现在有git'tags'project1和project2。我试图通过运行git ls-tree project1,然后git tag project1-1.0 <hash>来创建嵌套标记,但是如果我尝试检查结果标记,我会收到消息“无法将分支切换到非提交”。我看到我标记了一棵树而不是提交。

有没有一种聪明的方法可以让我手动创建标签?

回答

0

感谢@stuart让我走上正轨。我使用的过程有点冗长,但我认为我有正确的结果。

首先,我创建了一个包含SVN链接到我的标签“父”文件夹(那些包含版本编号的标签。)我处理该文件创建另一个包含路径包含在每个那些父母的文件:

#!/usr/bin/python 

import os 

f = open('parents') 
parentPaths = [x.strip('\n') for x in f.readlines()] 
f.close() 

for parentPath in parentPaths: 
    escapedPath = parentPath.replace('\\','\\\\').replace('/', '\\/').replace('&', '\\&') 
    c = "svn ls '" + parentPath + "' | sed -e 's/\\(.*\\)/" + escapedPath + "\\/\\1/' >> paths" 
    os.system(c) 

接下来我SVN版本号为每个使用该脚本的路径:

#!/usr/bin/python 

import os 

f = open('paths') 
ps = [ x.strip('\n') for x in f.readlines() ] 
f.close() 

for p in ps: 
    branchName = p.replace("svn://myrepo/tags/", "").strip(" ").rstrip("/\n").replace("/", "-").replace(" ", "-").replace(")", "").replace("(", "").lower() 
    eBN = branchName.replace("\\", "\\\\").replace("/", "\\/").replace("&", "\\&") 
    c = "svn log '" + p + "' --stop-on-copy -l 1 -v | grep -E '\\(from .*:[0-9]+\\)$' | sed -e 's/.*(from .*:\\([0-9]*\\))$/\\1/' >> revs/" + eBN 
    os.system(c) 

一个标签可能包含几个SVN的日志修订条目,所以我被改写的上述输出到一个名为单个文件转速.out:

#!/usr/bin/python 

import os 

o = open('revs.out', 'w') 
for filename in os.listdir('revs') : 
f = open('revs/' + filename) 
l = [ x.strip('\n') for x in f.readlines() ] 
f.close() 
o.write("{0} {1}\n".format(max(l), filename)) 

o.close() 

这包含,例如:

4073 myproject-version-1.12.44 
6982 myproject-version-1.13.9 

下位变得有点棘手。大部分标签都在主干上,我得到了git的承诺裁判对于那些像这样(在一个git回购运行):

#!/usr/bin/python 

import os 

f = open('../svn/revs.out') 
revs = [ x.strip('\n').split(' ') for x in f.readlines() ] 
f.close() 

for rev in revs: 
    r = rev[0] 
    n = rev[1] 

    c = "git log --all --grep '[email protected]" + r + " ' --pretty=format:%H | sed -e 's/\\(.*\\)/git tag " + n + " \\1\\n/' >> ~/src/svn/genTags.sh" 
    os.system(c) 

其他变量从树枝制成,或由夹在树干层次,或在'标签'层次结构中创建新文件夹时创建的空标签。这些情况我几乎是手动处理的。

此时的结果是一个本身会创建git标签的脚本。这里是摘录:

git tag project1-1.2.0.2 86e0f47f37ee28a3b16be26e4ab81a39a24015aa 
git tag project2-1.1.0.2 9cefabc1e8e66e974bb3d987a1089027535c8562 
git tag project2-1.1.0.8 1d3e9abe6f4ec440806d32ed60ae80a2568778eb 

然后我运行脚本来创建标签。

1

如果您在gitk(打开所有分支视图)中查找,并找到project1分支,您将能够看到该分支上的所有提交。通过并找到应该标记的那个,然后使用git tag <hash>。重复其他标签:)

+0

非常感谢您指点我正确的方向。有大约450个标签生成,我不得不想出一个脚本化的解决方案,并且我已经添加了一个答案的细节。 – RobH 2012-01-04 11:06:27