Воссоздание svn тегов в git ретроспективно - PullRequest
1 голос
/ 22 декабря 2011

Пару недель назад я преобразовал хранилище Subversion в git, подумал, что все выглядит хорошо, а затем переключился на работу исключительно с git. Однако теперь я замечаю, что допустил ошибку при конвертации тегов и веток.

В репозитории 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>, но если я попытаюсь проверить полученный тег, я получу сообщение «Невозможно переключить ветвь на нефиксированный». Я вижу, что я пометил дерево, а не коммит.

Есть ли у меня умный способ создать теги вручную?

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Если вы заглянете в gitk (включив представление всех ветвей) и найдете ветку project1, вы сможете увидеть все коммиты в этой ветке. Пройдите и найдите тот, который должен быть помечен, а затем используйте git tag <hash>. Повторите для других тегов:)

0 голосов
/ 04 января 2012

Спасибо @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

Затем я запустил скрипт для создания тегов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...