Как сохранить метки времени ревизии при конвертации репозитория из Mercurial в Subversion? - PullRequest
16 голосов
/ 29 июля 2011

Из-за рабочих политик я вынужден использовать Subversion. В настоящее время я разработал некоторый код с использованием Mercurial, и мне нужно преобразовать этот репозиторий в новый репозиторий Subversion. Текущий репозиторий Mercurial также содержит унаследованные части кода, которые я скопировал из другого SVN-репозитория (драйвер HW), и этот код содержит ключевые слова (например, $Id: ...$), которые были расширены, пока я копировал код.

Мой текущий подход к конвертации:

hg convert --dest-type svn repository.hg repository.svn

Это работает, к сожалению, оно не сохраняет временные метки версий Mercurial. Кроме того, он расширяет теги в некоторых старых частях кода, где кто-то написал $Id: ...$ материал.

Вопросы:

  1. Как я могу экспортировать в Subversion, сохраняя временные метки ревизий.
  2. Как конвертировать без расширения ключевых слов в стиле $ Id: $ или, что еще лучше, удалить ошибочные строки при конвертации. Возможно ли это, или мне нужно изменить историю Mercurial dump перед преобразованием, чтобы убедиться, что нет ключевых слов?

Извините, если на этот вопрос уже был дан ответ, я интенсивно искал в Google и здесь, но не могу найти ответ на эту проблему. Особенно проблема с меткой времени, с которой уже столкнулись другие.

Ура, H.

РЕДАКТИРОВАТЬ: С тех пор я создал скрипт, который извлекает временные метки из файла экспорта Mercurial и обновляет дамп-файл Subversion, который представляет собой не что иное, как кладж, но он работает. К сожалению, проблема $Id: до сих пор не решена.

Ответы [ 4 ]

3 голосов
/ 03 января 2012

Это сложная проблема.Зачем подходить к решению иначе:

https://bitbucket.org/durin42/hgsubversion/wiki/Home

Это расширение Mercurial, которое позволяет вам получить доступ к нему как к клиенту SVN, может ли оно работать для вас?

2 голосов
/ 30 марта 2012

Я однажды попытался заменить ключевое слово в SVN, и мне пришлось добавить свойство svn:keywords в рабочую папку, указывающее, какие ключевые слова нужно заменить.Таким образом, удаление этого свойства должно сработать.

Эта статья о переполнении стека , возможно, связана с этим вопросом.

2 голосов
/ 02 марта 2012

Я хочу повторно предложить hgsubversion в качестве решения.В обычном случае он используется для доступа к хранилищу Subversion с использованием hg, но вы также можете использовать его для преобразования хранилища Mercurial в Subversion, если вы не боитесь работать с вашей историей наборов изменений.(Если вы знаете, как работать с наборами изменений, у вас есть немного контроля над процессом.)

По сути, вы должны сделать следующие шаги:

  1. Сделать ваш Mercurialистория линейная (это требуется для Subversion);вы можете использовать Свернуть расширение , чтобы свернуть любую нелинейную область истории в один набор изменений
  2. Создать хранилище или каталог Subversion и hg pull этот путь SVN (используя hgsubversion) вваш Mercurial репозиторий.Возможно, для этого путь Subversion должен быть непустым, но до тех пор, пока файлы в хранилище Mercurial не перекрываются, это должно быть хорошо.
  3. Перебазировать все наборы изменений из истории Mercurial навершина главы истории Subversion.Это делается с помощью расширения Rebase .Если перекрытия нет, это должна быть автоматическая операция.
  4. Используйте hg push, чтобы отправить результат обратно в Subversion.Линейный набор изменений, которые происходят от прежней главы хранилища Subversion, будут добавлены в путь Subversion.

Проверьте в этой статье блога для некоторых конкретных команд командной строки, которыеВы можете использовать.

1 голос
/ 03 апреля 2012

Насколько я понимаю вашу проблему сейчас: у вас есть хранилище Hg, которое когда-то было конвертировано из SVN, где использовалось расширение ключевых слов.Теперь расширенные ключевые слова остаются без изменений в репозитории Hg.Теперь вы хотите удалить эти ключевые слова (или только их расширенные значения) из истории Hg, сохранив автора, дату / время, сообщение о коммите и конечно измененные файлы.

Это просто идея, которую я никогда не делалэто на практике, но ... Говоря только о Mercurial, я думаю, что это можно сделать с помощью комбинации обычного поведения Mercurial, только для одной ветви и без тегов и других ветвей:

  1. Клонироватьпредполагаемый исходный репозиторий
  2. Подготовьте пустой репозиторий Hg
  3. Выполните hg log > logfile.txt над исходным репозиторием в той ветви, которую вы хотите изменить
  4. Анализируйте файл, получая структурированный список всехнеобходимую информацию, такую ​​как номер набора изменений, пользователь, дата и сводка, сохраните ее в структуре данных, которая позволяет легко выполнять итерации
  5. Итерация по списку (или прямое использование файла журнала) и ...
    • удалить все рабочие файлы из целевого репо
    • экспортировать набор изменений из исходного репо в рабочую копию десРепозиторий
    • изменить что-либо в рабочих файлах, которые вы хотите сделать
    • hg addremove
    • hg commit -m ... -d ... -u ...
  6. Повторить шаг5 столько раз, сколько необходимо

Недостатком является то, что наборы изменений будут получать новые значения хеш-функции, поэтому теги и закладки необходимо обновлять.

Если есть другие ветви, которые должны бытьмигрировал:

  1. Обновите целевой репозиторий до начальной точки этой ветви
  2. и исходного репозитория тоже
  3. вставьте шаги 3–6 из приведенного выше списка здесь

Возможно, предстоит еще кое-что сделать, но я думаю, что это может сработать.Как я уже говорил, я никогда этого не делал.

...