Спасибо @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, поэтому я скопировал вывод вышеизложенного в один файл с именем revs.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 commit refs для таких как (работает в 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 'trunk@" + 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
Затем я запустил скрипт для создания тегов.